diff --git a/src/cal_tools/calcat_interface.py b/src/cal_tools/calcat_interface.py
index 359280e5b63baf7f809722d2721d7ace4c5eb36d..36f81dedcb57bab9dc8386f0f7aa572380481dc4 100644
--- a/src/cal_tools/calcat_interface.py
+++ b/src/cal_tools/calcat_interface.py
@@ -16,7 +16,7 @@ from calibration_client.modules import (
     PhysicalDetectorUnit,
 )
 
-from cal_tools.tools import module_index_to_qm
+from cal_tools.tools import module_index_to_qm, DisplayTables
 
 __all__ = [
     "CalCatError",
@@ -754,8 +754,7 @@ class CalibrationData:
                 Defaults to
                 "https://in.xfel.eu/calibration/calibration_constant_versions/".
         """
-        from IPython.display import Markdown, display
-        from tabulate import tabulate
+        from IPython.display import display
 
         if metadata is None:
             metadata = self.metadata()
@@ -768,6 +767,8 @@ class CalibrationData:
         cal_groups = [
             list(calibrations)[x:x+4] for x in range(0, len(calibrations), 4)]
 
+        tables = []
+
         # Loop over groups of calibrations.
         for cal_group in cal_groups:
             table = [["Modules"] + cal_group]
@@ -786,22 +787,17 @@ class CalibrationData:
                             c_mdata["begin_validity_at"]).strftime(
                                 "%Y-%m-%d %H:%M")
                         mod_consts.append(
-                            f"[{c_time}]({ccvs_url}/{c_mdata['ccv_id']})")
+                            (c_time, f"{ccvs_url}/{c_mdata['ccv_id']}")
+                        )
                     else:
                         # Constant is not available for this module.
                         mod_consts.append("___")
 
                 table.append([mod] + mod_consts)
 
-            display(
-                Markdown(
-                    tabulate(
-                        table,
-                        tablefmt="pipe",
-                        headers="firstrow",
-                        )
-                    )
-                )
+            tables.append(table)
+
+        display(DisplayTables(tables))
 
     def _build_condition(self, parameters):
         cond = dict()
diff --git a/src/cal_tools/tools.py b/src/cal_tools/tools.py
index d9e5e5f9e420a41dfff546b38e95a5fbd81c7bf8..79ec9bd3b64622ea7c6d686de7e3ca650e4d4518 100644
--- a/src/cal_tools/tools.py
+++ b/src/cal_tools/tools.py
@@ -1065,3 +1065,55 @@ def raw_data_location_string(proposal: str, runs: List[int]):
             " a preceding 'p'. Example: 'p900203'")
 
     return f"proposal:{proposal} runs:{' '.join(map(str, runs))}"
+
+
+class DisplayTables:
+    def __init__(self, tables):
+        # list (tables) of lists (rows) of lists (cells). A cell may be str,
+        # or a (text, url) tuple to make a link.
+        self.tables = tables
+
+    @staticmethod
+    def _build_table(table, fmt_link):
+        res = []
+        for row in table:
+            prepd_row = []
+            for cell in row:
+                if isinstance(cell, tuple):
+                    text, url = cell
+                else:
+                    text = cell
+                    url = None
+
+                if url is None:
+                    prepd_row.append(text)
+                else:
+                    prepd_row.append(fmt_link(text, url))
+            res.append(prepd_row)
+        return res
+
+    def _repr_markdown_(self):
+        from tabulate import tabulate
+
+        def fmt_link(text, url):
+            return f"[{text}]({url})"
+
+        prepd_tables = [self._build_table(table, fmt_link) for table in self.tables]
+
+        return '\n\n'.join(
+            tabulate(t, tablefmt="pipe", headers="firstrow")
+            for t in prepd_tables
+        )
+
+    def _repr_latex_(self):
+        from tabulate import tabulate
+
+        def fmt_link(text, url):
+            return r'\href{%s}{%s}' % (url, text)
+
+        prepd_tables = [self._build_table(table, fmt_link) for table in self.tables]
+
+        return '\n\n'.join(
+            tabulate(t, tablefmt="latex_raw", headers="firstrow")
+            for t in prepd_tables
+        )