保持(和控制)扩展性

保持(和控制)扩展性

在大多数情况下,当输出到达屏幕时,参数已完全展开,我的问题已无意义。但有时(逐字逐句是一个常见的例子),人们希望对具有不同扩展级别的参数进行操作。我的问题是如何保留扩展级别,或者相反,如何进行部分扩展。

以下 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,所以无法进一步扩展。

相关内容