我尝试将一个参数传递给代码环境(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}