如何才能使宏(例如,函数参数)在列表内正常扩展?

如何才能使宏(例如,函数参数)在列表内正常扩展?

我尝试将一个参数传递给代码环境(lstlisting):

\documentclass{standalone}
\usepackage{listings}
\def\parameter{home/Desktop/example_01/}
\begin{document}
\begin{lstlisting}
\parameter
\end{lstlisting}
\end{document}

但我得到的是\parameter输出,而不是目录。我该如何实现?

答案1

您没有解释为什么要在列表中使用控制序列的原因,但我至少可以想到一个:可维护性。这样,如果您更改宏的定义,则该更改会反映在列表中使用该宏的所有地方,就像在 TeX 文件的“普通文本”中发生的情况一样。

简单的解决方案

正如 David 指出的那样他的评论,但lstlisting是一个环境,其中\没有 TeX 中通常具有的特殊含义。因此,\parameter不会被解释为宏,而只会被打印出来逐字

如果您想\parameter在列表中进行扩展,您别无选择,只能使用 LaTeX。listings有关更多详细信息,请参阅文档第 4.14 节。

在此处输入图片描述

\documentclass{standalone}
\usepackage{listings}
\def\parameter{https://tex.stackexchange.com/}
\begin{document}
\begin{lstlisting}[escapechar=`]
`\parameter`
\end{lstlisting}
\end{document}

listings使用突出显示的更高级解决方案

如果您希望宏的替换文本\parameter以“当前列表样式”排版,即\parameter宏出现的列表中使用的样式,那么情况就更加复杂了。例如,如果\parameter出现在注释中,您可能希望它以注释样式排版(无论它是什么);如果它出现在字符串中,您可能希望它以字符串样式排版,等等。

其中一种方法是将当前样式保存在currentStyle@lstparam全局范围内的宏(下面调用)中,然后在控制序列的定义中调用该宏\parameter

请参阅下文中将此方法应用于哈斯克尔清单。

在此处输入图片描述

\listparam请注意,此处( )的替换文本ns采用列表的当前样式。现在,例如,如果您在 的定义中xs替换,则该更改会反映在列表中每次出现的 中:ns\listparam\listparam

在此处输入图片描述

就这样。

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage[scaled=.85]{beramono}
\usepackage{listings}
\usepackage[dvipsnames]{xcolor}

% some listings shenanigans to have access to the current listings style
% within an escape to LaTeX
\makeatletter
\newcommand\currentStyle@lstparam{}
\lst@AddToHook{Output}{\global\let\currentStyle@lstparam\lst@thestyle}
\lst@AddToHook{OutputOther}{\global\let\currentStyle@lstparam\lst@thestyle}
\makeatother

% define a character for escaping to LaTeX from within a listing
\lstset{escapechar=`}

% define a placeholder
\makeatletter
\newcommand\listparam{\currentStyle@lstparam ns} %<-- try to change that to `xs'
\makeatother

% set things up for our Haskell example
\lstset{
  language = Haskell,
  basicstyle = \ttfamily,
  commentstyle = \color{ForestGreen},
  stringstyle  = \color{magenta},
  showstringspaces=false,
}

\begin{document}

\begin{lstlisting}
-- a low-level reimplementation of 'last' (just for exposition purposes)
-- last `\listparam` : the last element of the list '`\listparam`'
last :: [a] -> [a]
last [] = error "List argument `\listparam` is empty, silly!"
last `\listparam` =
  if null (tail `\listparam`) then
    head `\listparam`
  else
    last (tail `\listparam`)
\end{lstlisting}

\end{document}

相关内容