命令在宏中的行为与命令本身的行为不同

命令在宏中的行为与命令本身的行为不同

listings我正在尝试按照此处显示的建议在环境左侧添加注释:https://zuttobenkyou.wordpress.com/2010/12/05/latex-saner-source-code-listings-no-starch-press-style/\vbox{\llap{*\hskip 1em}}使用转义序列内的 命令。

但是当我将命令放入宏中时,它会移动行,而如果我直接添加命令则不会移动。有人能解释为什么会这样吗?下面显示了一个 MWE。

对于背景,listings如果将代码放在转义序列中,则允许您在逐字环境中恢复到任意 LaTeX 代码,在这种情况下,转义序列定义为以 开头(*@并以 结尾@*)。该llap命令创建一个宽度为零的框;然后将参数放置在这个零宽度框的左侧(因此将与左侧的任何内容重叠)。我不确定该命令的要点vbox是什么。

\documentclass{article}

\usepackage{listings}

\newcommand*{\lnote}{
  \vbox{\llap{*\hskip 1em}}
}

\begin{document}

\begin{lstlisting}[escapeinside={(*@}{@*)}, frame=single]
(*@\vbox{\llap{*\hskip 1em}}@*)echo hello
(*@\lnote@*)echo goodbye
\end{lstlisting}

\end{document}

文档编译后如下所示。第一行按预期工作,第二行则产生了不希望的水平偏移。

在此处输入图片描述

答案1

您的 lnote 命令正在添加空格标记。我在这里将它们从定义中注释掉了。

\documentclass{article}

\usepackage{listings}

\newcommand*{\lnote}{%
  \vbox{\llap{*\hskip 1em}}%
}

\begin{document}

\begin{lstlisting}[escapeinside={(*@}{@*)}, frame=single]
(*@\vbox{\llap{*\hskip 1em}}@*)echo hello
(*@\lnote@*)echo goodbye
\end{lstlisting}

\end{document}

为什么这里要用垂直盒子?这似乎是一个非常不符合乳胶的结构。

相关内容