\newcommand 中的 Verbatim 环境

\newcommand 中的 Verbatim 环境

我想创建两个命令\begin{verbatim}\end{verbatim}使其更短,如下所示:

\newcommand{\bv}{\begin{verbatim}}
\newcommand{\ev}{\end{verbatim}}

我已经对itemize环境做了类似的事情:

\newcommand{\bi}{\begin{itemize}}
\newcommand{\ei}{\end{itemize}}

最后一个有效。但是逐字模式不起作用,因为在定义新命令时会立即应用逐字模式。是否可以实现我想要的效果?我尝试了一些带有 、 和 的语句,\expandafter\noexpand无法\csname...\endcsname获得结果。我需要一种\begin{verbatim}和 的简短别名\end{verbatim}

答案1

是的,你可以重新定义 LaTeX 的 verabtim,但这比较棘手。你必须开始 catcode 舞蹈并重新定义内部 LaTeX\@xverbatim宏:

\def\bv{\begin{verbatim}}
{\catcode`\@=11 \catcode `|=0 \catcode`\\=12 |gdef|@xverbatim#1\ev{#1|end{verbatim}}}

测试:

\documentclass{article}
\usepackage{amsmath}
\begin{document}

\def\bv{\begin{verbatim}}
{\catcode`\@=11 \catcode `|=0 \catcode`\\=12 |gdef|@xverbatim#1\ev{#1|end{verbatim}}}

You can try:
\bv
A verbatim
text is here # \ ^ ?
\ev

Next text.

\end{document}

答案2

定义用于调用宏的简写宏\begin和/或用于调用宏\end是否有效或失败取决于相关环境的工作方式。

在从 .tex 文件读取输入时,TeX 会将该文件的内容作为一组指令,用于将所谓的标记附加到标记流中。
读取和标记化后,TeX 中的所有内容都基于标记。
宏编程和执行分配都基于标记并侧重于标记。

\begin{foo}例如, .tex 文件中出现的短语通常会将标记、 、 、 、附加\begin到标记流中。{1f11o11o11}2

控制字标记\begin表示宏的一个实例\begin。显式字符标记和表示构成此宏实例参数的标记元组。显式字符标记、、是此宏实例的参数。{1}2\beginf11o11o11\begin

由 触发执行的最重要的事情\begin,即 是:\begin{⟨name of the environment to begin⟩}

  • 开拓新的本地范围。
  • 将要开始的环境名称(来自 的参数)保存\begin到宏 中\@currenvir。当达到 时,用于在 中存储的名称与⟨ 不匹配时触发错误消息\end{⟨name of the environment to end⟩}\@currenvir\@currenvir要结束的环境的名称⟩ 给定\end{...}
  • 通过创建并附加到标记流的控制序列标记,其名称来自宏的参数。通常,该控制序列标记表示用于启动执行特定于所讨论环境的任何操作的宏。\csname⟨name of the environment to begin⟩\endcsname\begin

\end{foo}类似地, .tex 文件中出现的 短语通常会导致将标记\end、、、、附加到标记流中。{1f11o11o11}2

由 触发执行的最重要的事情\end,即 是:\end{⟨name of the environment to end⟩}

  • 如果当前本地范围的名称/⟨开始的环境名称⟩ 存储在\@currenvir与宏的参数不匹配\end/ 与 ⟨要结束的环境的名称⟩.
  • 通过创建并附加到标记流的控制序列标记,其名称具有前缀“end”,并且名称的其余部分是⟨\csname end⟨name of the environment to end⟩\endcsname要结束的环境的名称⟩. 该标记可能表示一个宏,当通过 打开的本地范围\begin{...}即将关闭时,启动执行任何操作,这些操作也是特定于环境的。
  • 关闭本地范围。

(我说“最重要的事情”是因为实际上 with\begin和 with都\end做了更多的事情——特别是自从 LaTeX 2ε 中建立了新的挂钩系统以来,但不需要了解这些事情就可以理解为什么在某些环境中定义调用的简写宏\end{...}不起作用。)

通常情况下,你可以编写一个简写宏,通过展开可以得到标记\end,,,,。{1f11o11o11}2

通常情况下,这些标记在读取/标记化 .tex 文件的行过程中产生或在扩展简写宏的过程中产生并不重要。

但有些环境的工作方式不同。

例如,逐字逐句的环境。

该环境的目的是按原样排版材料,这些材料在 .tex 文件中放置在行\begin{verbatim}和行之间\end{verbatim}
该环境的目的是使 TeX 不接受来自 .tex 文件的输入并遵循\begin{verbatim}要执行的控制序列以及要查看其通常定义/通常含义的控制序列,而是接受来自 .tex 文件的后续输入以进行按原样排版,而不查看通常定义/含义,不进行扩展,也不进行任何其他执行方式。

因此,.tex 文件中的短语\end{verbatim}是 .tex 文件中出现的排版内容的结束标记。

在 .tex 文件中遇到标记之前按原样排版的概念意味着为该标记定义简写宏不起作用:

如果在 .tex 文件中,除了该标记之外,还出现了一些不同的东西,旨在作为该标记的简写,那么 TeX 如何知道这次应该遵循通常的定义,而不是不看它而是按原样排版形成简写的字符?

\begin{verbatim}像往常一样产生代\begin币,,,,,,,,,,。​​​​{1v11e11r11b11a11t11i11m11}2

通过内部,\csname..\endcsname您可以获得一个控制序列令牌\verbatim,该令牌可以逐字启动针对环境的特定操作的执行。

其中最重要的是:

  • 更改类别代码机制,使得在处理来自 .tex 文件的输入的某个阶段,对 .tex 文件中出现的任何字符进行标记化通常会触发 TeX 执行某些特殊操作,只会产生一个类别 12(其他)的普通字符标记,其中没有与任何特殊操作相关的操作,但是 — — 如果正在使用用于执行此操作的字体 — — 会导致排版一个字符,就像!在 .tex 文件中通常被标记成,这反过来可能导致排版一个感叹号。 例如,通常被标记成,并且该标记在到达 TeX 的胃部时,会触发切换数学模式。例如,(反斜杠)在读取和标记来自 .tex 文件的输入行的阶段通常是开始创建控制序列标记的触发器。 在逐字类别代码制度中,情况并非如此,但对这些字符进行标记会产生类别 12(其他)的普通显式字符标记,这些标记不会导致 TeX 执行特殊操作,并且如果使用字体,则可以像感叹号一样进行排版。!12
    $$3\
  • 从 .tex 文件中逐行读取并标记内容,然后将其排版到等宽字体中。直到遇到读取并标记一行 .tex 文件产生标记, , , , , , , , , , , ,的情况。\12e11n11d11{12v11e11r11b11a11t11i11m11}12

但是,当在 .tex 文件中输入的不是短语而是\end{verbatim}对简写宏的调用时,这种情况就不会发生,并且在处理的某个阶段你会收到一些错误消息,如果你不熟悉 TeX 的工作原理以及环境逐字如何在 LaTeX 中实现,这些错误消息可能看起来令人费解。

要点是:定义和使用简写宏进行调用仅在不会启动算法的执行的情况下才有效,该算法的终止取决于在没有扩展的情况下遇到特定的标记星座,该标记星座作为已到达形成环境主体的 .tex-file-input 位的末尾并终止算法的标记。\end{⟨name of the environment to end⟩}\begin{⟨name of the environment to begin⟩}

在环境下,形成“结束标记”的标记星座是:,,,,,,,,,,,,,,,,, 即在 逐字verbatim类别代码制度下进行标记化时产生的东西。 \12e11n11d11{12v11e11r11b11a11t11i11m11}12

由于环境的主体和结束标记都需要从 .tex 文件中逐字读取,并根据逐字类别代码制度进行标记,因此

\newcommand\macro{%
  \begin{verbatim}
  ...
  \end{verbatim}
}%

也行不通,因为在这里,在标记和执行-directive\newcommand及其参数时,所有应该在逐字类别代码制度下标记的内容都会在通常/默认类别代码制度下进行标记。

但是也存在这样的环境,即在通常/默认类别代码机制下进行标记化时,环境主体和构成环境“结束标记”的标记群都会出现。但是在这样的环境中,仍然需要找到结束标记标记群,而不是形成该标记简写的标记群。

但是在这样的环境下你可以做类似的事情

\newcommand\macro{%
  \begin{foo}
  ...
  \end{foo}
}%

因为这里的扩展\macro还会传递形成正确结束标记的标记。

相关内容