在大多数情况下,当输出到达屏幕时,参数已完全展开,我的问题已无意义。但有时(逐字逐句是一个常见的例子),人们希望对具有不同扩展级别的参数进行操作。我的问题是如何保留扩展级别,或者相反,如何进行部分扩展。
以下 MWE 演示了论证的扩展程度如何影响结果:
\documentclass{article}
\usepackage[T1]{fontenc}
\newcommand\display[1]{\expandafter\string#1}
\begin{document}
\display{\large word}\par
\def\x{\large word}
\display{\x}
\end{document}
在第一种情况下,我将实际文本传递给宏\display
并获取顶行。但如果我将相同的文本填充到宏中\x
并将其传递给宏\display
,它会产生不同的输出,因为两次不同的调用为宏提供了不同扩展级别的参数。
对于 MWE,如何协调任一方向的输出(即,如果第一个输出是我实际上从第二个实例中寻求的,或者,如果第二个输出是我实际上从第一个实例中寻求的)?
与此 MWE 相关的是,想知道是否有类似的东西,\verbatim{\x}
它可以打印出第一级扩展的逐字内容\x
,例如 MWE,生成\large word
(包括空格)。
更一般地说,当你的宏得到的内容可能与原始的“纯”文本相差甚远时,LaTeX 用于控制参数扩展的技术是什么。
答案1
有了 e-TeX,\detokenize
原语就可以满足您的要求:它将所有材料转换为 catcode-12 标记,除了 catcode 10 的空格。它还会在控制字后插入空格。\detokenize
具有类似 toks 的语法,因此可以以以下形式使用
\def\display#1{\detokenize\expandafter{#1}}
原始\detokenize
的是可扩展的,因此您可以举例说明\edef
这一点。
不可扩展的版本没有 e-TeX,可以实现为
\makeatletter
\newcommand{\display}[1]{%
\def\@tempa{#1}%
\expandafter\strip@prefix\meaning\@tempa
}
\makeatother
\strip@prefix
在 LaTeX 中并与纯 TeX 中的相应定义一致。
(e-TeX 手册从概念上描述了 的操作\detokenize
,即保存到 toks 并将其写入文件,然后使用逐字的 catcode 读回。 的使用\meaning
更加清晰,避免了使用文件,并且在任何情况下都不可扩展。)
答案2
也许您正在寻找的是
\def\display#1{\texttt{\expandafter\strip@prefix\meaning#1}}
它给出了第一级扩展的逐字呈现,#1
但与您的示例类似,传入多个标记作为实际上没有任何意义#1
。
您的示例或此示例中的任何后续标记都只是按正常方式排版。
但请注意,的输出\meaning
实际上并不是第一级扩展,因为它都是 catcode 12,所以无法进一步扩展。