我有很多地方想要在逐字模式下编写一些简短的片段,特别是在连续文本(段落内)中保留空格。我真的很想为此创建一个宏,但无法使其工作。环境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}