我正在尝试利用 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 本身实现的命令除外,例如HugeText
或TextColor
)。
或者,您可以使用通用Command
类并提供 LaTeX 名称作为第一个参数。在这种情况下,您不需要单独的类定义。示例:
doc.append(Command('exampleCommand',arguments=Arguments('blue','Hello','World')))