如何在 LaTeX 宏中逐字书写?

如何在 LaTeX 宏中逐字书写?

我有很多地方想要在逐字模式下编写一些简短的片段,特别是在连续文本(段落内)中保留空格。我真的很想为此创建一个宏,但无法使其工作。环境verbatim不适合,因为它会创建一个新段落,但我\Verb+...+fancyvrb包中找到了可以满足我要求的。但它在宏中不起作用(即\newcommand{})。当我在宏中使用它时,切换到等宽字体仍然有效,但多个空格会折叠成单个空格,这与在宏外使用它不同。为什么它在宏中的行为不同?

我怎样才能实现我想要的,可能用一些不同的东西fancyvrb

答案1

如果是关于代码片段,我建议

\usepackage{listings}   
...
\lstinputlisting[language=Python]{SOURCEFILE.py}   % e.g. for Python

答案2

您可以定义一个宏\defineverbatimphrase,该宏采用宏名并从 .tex 文件中读取并标记逐字逐句的参数,并将该宏定义为健壮的并提供包装在中的逐字参数\scantokens{...}

您可能希望在抓取逐字参数之前将水平制表符( ) 的类别代码切换^^I为 12——参数类型不会为您执行此操作。\defineverbatimphrase+v

使用宏来传递包装中的内容时,\scantokens您可能希望有一个本地范围,该范围在\scantokens执行其伪写入部分时有效,并且\newlinechar等于\endlinechar,并且您可能希望附加一个百分比字符,当\scantokens执行其读回和重新标记伪文件部分时,该百分比字符被识别为注释字符,以便在处理伪文件的最后一“行”时附加的结束符\scantokens位于该注释字符后面,因此不会被 TeX 处理:

\documentclass{article}

\newcommand\foo[1]{#1}%

\DeclareRobustCommand\defineverbatimphrase[1]{%
  \begingroup\catcode`\^^I=12 \innerdefineverbphrase{#1}%
}%
\begingroup
\makeatletter \catcode`\Z=14 \catcode`\%=12
\foo{Z
  \endgroup
  \NewDocumentCommand\innerdefineverbphrase{m+v}{Z
    \endgroup
    \@ifdefinable{#1}{Z
      \DeclareRobustCommand#1{\begingroup\newlinechar=\endlinechar\scantokens{\endgroup#2%}}Z
    }Z
  }Z
}%

\defineverbatimphrase\myMacroA{\verb|AB#%§$_^\relax|}
\defineverbatimphrase\myMacroB{%
\begin{verbatim}
AB#%§$_^\relax
\end{verbatim}}

\begin{document}

\noindent text \foo{\myMacroA} text

\noindent text\myMacroB text

\end{document}

在此处输入图片描述

相关内容