闲言碎语

正则表达式是一种功能强大的字符串处理工具,几乎所有关于字符串的操作都可以用它来实现。本篇将展示如何使用 Python 中的正则表达式来编写 LaTeX 工具。


闲言碎语

正则表达式是一种功能强大的字符串处理工具,几乎所有关于字符串的操作都可以用它来实现。本篇文章将展示如何使用 Python 中的正则表达式来编写 LaTeX 工具。

我们先展示效果,末尾再补充代码,将其写入 mylatex.py 即可使用本文的示例。


您提供的关于 LaTeX 矩阵与 Markdown 表格的代码及示例都很好,下面是一些润色建议,以便提升清晰度和可读性。


LaTeX 矩阵

示例

计算矩阵的 5 次幂,并导出 LaTeX 代码:

(123234456)\begin{align*} \left(\begin{array}{ccc} 1 & 2 & 3 \\ 2 & 3 & 4 \\ 4 & 5 & 6 \end{array}\right) \end{align*}

  1. 输入代码如下:

    1
    2
    3
    from mylatex import latex_matrix
    mat = matrix([[1, 2, 3], [2, 3, 4], [4, 5, 6]]) # matrix 是 sagemath 自带函数
    latex_matrix(list(mat^5))
  2. 输出的 LaTeX 代码效果:

    matrix

注:本例中使用的代码为 sagemath;实际上,sagemath 自带的功能可以输出 LaTeX 格式,不过样式较为固定。

函数代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
def latex_matrix(mat: list, hrows=None, hcols=None, copy=True) -> str:
"""生成矩阵的 LaTeX 代码

Args:
mat (list): 矩阵主体
hrows (set, optional): 指定划线的行. 默认为 None.
hcols (set, optional): 指定划线的列. 默认为 None.
copy (bool, optional): 是否复制到剪贴板. 默认为 True.

Returns:
str: 生成的 LaTeX 代码

注:
hrows = {0, 1} 表示在顶行和第 1 行划线。
"""
# 检查输入
assert len(mat), "输入为空矩阵"
# 将数据转化为字符串
mat = [[str(i) for i in line] for line in mat]
# 行数和列数
m, n = len(mat), len(mat[0])
# 设置列线
hcols = hcols or set()
f = lambda i: '|c' if i in hcols else "c"
# 设置行线
hrows = hrows or set()
g = lambda i: r'\\\hline' if i in hrows else r'\\'

# 头部
col_format = "".join(f(i) for i in range(n))
if n in hcols:
col_format += '|'
beg = r"""\begin{align*}
\left(\begin{array}{%s}
""" % col_format
# 尾部
end = "\n\\end{array}\\right)\n\\end{align*}"
# 内容部分
content = "\\hline\n" if 0 in hrows else ""
content += "\n".join(["&".join(line) + g(i) for i, line in enumerate(mat)])

# 输出结果
out = beg + content[:-2] + end
if copy:
pyperclip.copy(out)
return out

Markdown 表格

Markdown 语法请参阅 这篇博客。下面我们讨论 Markdown 表格的生成方法,其与 LaTeX 的思路类似。

示例

  1. 打印表格,输入代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    from mylatex import markdown_table, MDtable_to_array_table
    # 方法一:指定标题
    content = [[1, 2, 3], [2, 3, 4]]
    title = ["a", "b", "c"]
    markdown_table(content, title=title)

    # 方法二:不指定标题
    content = [["a", "b", "c"], [1, 2, 3], [2, 3, 4]]
    markdown_table(content)
  2. 显示效果:

    a b c
    1 2 3
    2 3 4

注:使用 MDtable_to_array_table 可将 Markdown 格式的表格代码转换为 LaTeX 的 array 形式

Python 代码

  1. 将列表转换为 Markdown 表格

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    def markdown_table(content: list, title=None, copy=True) -> str:
    """将列表转化为 Markdown 表格格式

    Args:
    content (list): 表格内容
    title (list, optional): 表格标题,默认为 content 的第一行
    copy (bool, optional): 是否复制到剪贴板. 默认为 True.

    Returns:
    str: 生成的 Markdown 代码
    """
    # 表格第二行格式(居中)
    align = "|".join([":-:"] * len(content[0]))
    # 行内元素用 | 分割
    content = ["|".join(str(i) for i in line) for line in content]
    # 设置标题
    if title is None: # 未定义标题,默认取第一行为标题
    title = content[0]
    content = content[1:]
    else:
    title = "|".join(str(i) for i in title)
    # 合并并导出文本
    txt = "\n".join([title, align, *content])
    if copy:
    pyperclip.copy(txt)
    return txt
  2. 将 Markdown 表格转换为 LaTeX 的 array 表格

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def MDtable_to_array_table(txt: str, copy=True) -> str:
    """将 Markdown 格式的字符串转换为 LaTeX 数组形式

    Args:
    txt (str): Markdown 表格字符串
    copy (bool, optional): 是否复制到剪贴板. 默认为 True.

    Returns:
    str: 生成的 LaTeX 代码
    """
    lines = txt.split("\n") # 按行拆分
    lines.pop(1) # 去掉格式行
    lines = [line.split("|") for line in lines]
    return latex_array_table(lines, copy=copy)

Dynkin 图

TODO。

毕业论文要画很多图,之前用 tikz + python 写绘图工具,做了一部分。工具完整成型再放上来。

小结

以上,我们用 Python 编写工具,以自动生成 LaTeX 和 Markdown 格式的代码。