pyLaTeX - 创建自定义命令

pyLaTeX - 创建自定义命令

我正在尝试利用 pyLaTeX 库制作下面的 LaTeX 命令,目的是在文档的后面调用此函数。

\newcommand*\Entry[2]{%
  \sffamily#1 & #2}

我正在尝试遵循官方 pyLaTeX 文档中的“自己的命令示例”,但有一些问题。文档的相关部分如下:

class ExampleCommand(CommandBase):
    """
    A class representing a custom LaTeX command.

    This class represents a custom LaTeX command named
    ``exampleCommand``.
    """

    _latex_name = 'exampleCommand'
    packages = [Package('color')]

doc = Document()
with doc.create(Section('Custom commands')):
    # Define the new command
    new_comm = UnsafeCommand('newcommand', '\exampleCommand', options=3,
                             extra_arguments=r'\color{#1} #2 #3 \color{black}')
    doc.append(new_comm)

    # Use our newly created command with different arguments
    doc.append(ExampleCommand(arguments=Arguments('blue', 'Hello', 'World!')))
    doc.append(ExampleCommand(arguments=Arguments('green', 'Hello', 'World!')))
    doc.append(ExampleCommand(arguments=Arguments('red', 'Hello', 'World!')))

生成 LaTeX 的结果如下:

\newcommand{\exampleCommand}[3]{\color{#1} #2 #3 \color{black}}%
\exampleCommand{blue}{Hello}{World!}%
\exampleCommand{green}{Hello}{World!}%
\exampleCommand{red}{Hello}{World!}

我的问题是,此示例中的类的用途是什么?是否仅因为我们要导入 LaTeX 包才需要它?我尝试创建的命令是否需要这样的类?

此外,如果类正在建立命令,那么 new_comm 函数的用途是什么?它在代码示例中的其他任何时候都没有被调用,所以我不确定它的用途。

答案1

您不一定需要使用 PyLaTeX 提供的函数和类。您可以使用包装器将任意文本或 LaTeX 代码作为字符串添加到文档中NoEscape。要添加包,可以使用doc.packages.append,对于其他前导代码(例如命令定义(通常也在前导中)),可以使用doc.preamble.append,对于文档本身也doc.append可以使用 。

手动示例和您自己的命令的 MWE:

from pylatex import Document, Package, NoEscape

doc = Document()
doc.packages.append(Package('color'))
doc.preamble.append(NoEscape(r'\newcommand{\exampleCommand}[3]{\color{#1} #2 #3 \color{black}}'))
doc.append(NoEscape(r'\exampleCommand{blue}{Hello}{World!}'))

doc.preamble.append(NoEscape(r'\newcommand*\Entry[2]{\sffamily#1 & #2}'))
doc.append(NoEscape(r'\begin{tabular}{ll}'))
doc.append(NoEscape(r'\Entry{abc}{123}\\'))
doc.append(NoEscape(r'\end{tabular}'))

doc.generate_tex('pycommands')

生成pycommands.tex

\documentclass{article}%
\usepackage[T1]{fontenc}%
\usepackage[utf8]{inputenc}%
\usepackage{lmodern}%
\usepackage{textcomp}%
\usepackage{lastpage}%
\usepackage{color}%
%
\newcommand{\exampleCommand}[3]{\color{#1} #2 #3 \color{black}}%
\newcommand*\Entry[2]{\sffamily#1 & #2}%
%
\begin{document}%
\normalsize%
\exampleCommand{blue}{Hello}{World!}%
\begin{tabular}{ll}%
\Entry{abc}{123}\\%
\end{tabular}%
\end{document}

结果:

在此处输入图片描述

然而,PyLaTeX 并非只是普通 LaTeX 代码的包装器。其理念是将 LaTeX 语法的许多相关部分形式化,这样便可以使用存储在 Python 数据结构中的参数轻松调用 LaTeX 命令,并且可以灵活地从 Python 代码生成文档本身。

对于此预期用途,您确实需要类和命令。CommandBase手册中的类不仅提供了一种指示此命令需要color包的方法,而且还为命令生成了接口,允许以 Python 字符串或变量列表的形式提供参数,即语法ExampleCommand(arguments=Arguments('blue', 'Hello', 'World!'))

new_comm部分导致将\newcommand代码添加到文档中,这是代码的单独部分,因为它仅用于自定义命令。但是,如果您想使用手册中的语法,则所有命令都需要类定义(PyLaTeX 本身实现的命令除外,例如HugeTextTextColor)。

或者,您可以使用通用Command类并提供 LaTeX 名称作为第一个参数。在这种情况下,您不需要单独的类定义。示例:

doc.append(Command('exampleCommand',arguments=Arguments('blue','Hello','World')))

相关内容