如何在铸造的内联代码中调用宏?

如何在铸造的内联代码中调用宏?

如何在minted单行命令中使用命令?

此代码

\newcommand{\HADOOPUSER}{hduser}
\mint{console}|sudo groupadd \HADOOPUSER|

目前生产

sudo groupadd \HADOOPUSER

而我想要的输出是

sudo groupadd hduser

答案1

虽然我非常喜欢minted,但我认为它不是你想要做的正确工具。在由 排版的列表中调用宏minted目前非常有限(截至 v1.7)。该包确实提供了一个名为的选项,mathescape允许转义到 LaTeX(即将一系列标记解释为 LaTeX 代码而不是逐字),但

  • 只有这样才能摆脱 LaTeX正在使用的语言中的评论
  • 该特征主要面向数学性质的内容。

以下是根据手册改编的示例minted

在此处输入图片描述

\documentclass{article}

\usepackage{minted}

\begin{document}
\begin{minted}[mathescape]{python}
# Returns $\sum_{i=1}ˆ{n}i$
def sum_from_one_to(n):
    r = range(1, n + 1)
return sum(r)
# An escape to LateX won't work outside comments
$\sum_{i=1}ˆ{n}i$
\end{minted}
\end{document}

显然,您的 shell 脚本不是注释,因此无法让您的宏展开到列表中的替换文本。实际上,我从Python 源代码您使用的词法分析器console(又名BashSessionLexer) 的一个缺点是它没有定义 shell 行末注释 (以 开头#)。因此,如果您使用该词法分析器,您甚至无法在代码的任何地方 (无论是注释内部还是外部) 转为 LaTeX,如下面的示例所示。

在此处输入图片描述

\documentclass{article}

\usepackage{minted}

\newcommand{\HADOOPUSER}{hduser}

\begin{document}
\begin{minted}[mathescape]{console}
sudo groupadd #$\HADOOPUSER$
\end{minted}
\end{document}

另一种方法是使用listings包而不是minted。使用一些补丁,内联代码中可以允许转义为 LaTeX listings。如果您认为这会有所帮助,我可以扩展我的答案以提供基于的解决方案listings


然而。我认为在内联代码中转而使用 LaTeX 是愚蠢的。在我看来,内联代码应该保留用于排版单个标识符(关键字、变量等);任何比这更长的代码都有可能弄乱你的段落。对于较长的代码片段(即使对于带有参数的命令,例如sudo groupadd hduser),你应该使用显示列表:

\begin{minted}{console}
sudo groupadd hduser
\end{minted}

如果您遵循此规则,您就不需要在内联代码中转而使用 LaTeX。

答案2

我提供一个 ConTeXt 解决方案,因为我不知道 LaTeX 中 LuaTeX 包的状态。

一种可能性是使用 Lua(而不是 TeX)来翻译您的输入。为此,ConTeXt 提供了一个m-translate可与该vim模块一起使用的模块。(该vim模块使用 vim 来生成语法突出显示;因此,原则上,这也应该适用于 minted+LaTeX)。

\usemodule[vim]

\usemodule[translate]
\translateinput[HADOOPUSER][hduser]

\definevimtyping[console][syntax=bash, before=\enableinputtranslation, after=\disableinputtranslation]

\starttext

Translated: \inlineconsole{sudo groupadd HADOOPUSER}

This only works inside console environment, not regular text. For example
HADOOPUSER.


\stoptext

这使

在此处输入图片描述

它的工作原理如下:将文本sudo groupadd HADOOPUSER写入外部文件并转换为\SYNBOL{}sudo groupadd HADOOPUSER\SYNEOL{}。当 TeX 读取该文件时,\enableinputtranslation处于活动状态,因此该行将转换为\SYNBOL{}sudo groupadd hduser\SYNEOL{}并传递给 TeX,其中的宏t-vim添加了必要的语法突出显示。

相关内容