diff --git a/tutorials/dev/low_level_custom_pass.py b/tutorials/dev/low_level_custom_pass.py
index 617093d4a595609584ea8b530bba35b8d525f114..68e569477440f079ed6a0a65873bcbfa65c7839b 100644
--- a/tutorials/dev/low_level_custom_pass.py
+++ b/tutorials/dev/low_level_custom_pass.py
@@ -7,18 +7,22 @@ TVM is a framework that abstracts away the heterogenity of machine learning acce
 Sometimes users may want customize some analysis and IR transformations
 to adapt TVM to their own specialized hardware. This tutorial helps users write
 a customized pass in TVM.
+
  Prerequisites
--------------
+--------------
+
 Before reading this tutorial, we assume readers have already known these topics well:
+
 - Writing an algorithm in TVM and schedule it. Otherwise, see example tutorials like
-  `Optimize GeMM on CPU <https://docs.tvm.ai/tutorials/optimize/opt_gemm.html>_`.
+  :ref:`opt-gemm`.
 - The basic structure of HalideIR. Otherwise, see ``HalideIR/src/ir/IR.h`` to learn what
   attributes of IR nodes are defined.
 - Visitor design pattern. Otherwise, check the
-  `Python AST module <https://docs.python.org/3/library/ast.html>_` to see how an AST
+  `Python AST module <https://docs.python.org/3/library/ast.html>`_ to see how an AST
   visitor is implemented.
 - How a HalideIR/Schedule is lowered to either a LoweredFunc class or a LLVM module. Otherwise,
   take a look at ``python/tvm/build_module.py`` to get some basics.
+
 """
 
 from __future__ import absolute_import, print_function
diff --git a/tutorials/optimize/opt_gemm.py b/tutorials/optimize/opt_gemm.py
index 803b81e7d2221e70d723c6adb96f30b9f6fdbdd3..6a0a252289103c92deb22ab22444f11871c9b506 100644
--- a/tutorials/optimize/opt_gemm.py
+++ b/tutorials/optimize/opt_gemm.py
@@ -1,4 +1,6 @@
 """
+.. _opt-gemm:
+
 How to optimize GEMM on CPU
 ===========================
 **Author**: `Jian Weng <https://github.com/were>`_, \