我试图理解commandchars
fancyverb 的含义Verbatim
:
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\phantom{foo}
\begin{Verbatim}[commandchars=\\\!\!]
\phantom{bar}
trait Sys[S <: Sys[S]] {
type ID <: Ident[S#Tx]
type Tx
}
\end{Verbatim}
\end{document}
这打印bar}
在原稿的第一行。我有三个问题:
- 为什么如果我使用的话会打印这个
\phantom
。 - 为什么要包含右花括号?
- 我不能使用,
commandchars=\\\{\}
因为它与编程语言打印的花括号冲突。所以我使用[commandchars=\\\!\!]
。但是当我尝试插入时,\phantom!bar!
我只得到错误\FancyVerbGetLine has an extra }
。
实际上,我想要实现的只是打印一个前导空行,但这行不通——而是出现了半高行。所以我的想法是最简单的方法是通过添加幻像字符来强制第一行的高度。
答案1
错误在于
commandchars=\\\!\!
您必须指定三个清楚的格式中的字符\<char>
;第一个字符将用于代替反斜杠,第二个字符用于代替左括号,第三个字符用于代替右括号。因此,
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}[commandchars=\\\!\?]
\phantom!bar?XYZ
trait Sys[S <: Sys[S]] {
type ID <: Ident[S#Tx]
type Tx
}
\end{Verbatim}
\end{document}
我添加XYZ
只是为了表明幻影是值得尊敬的。一行中只有一个幻影是没用的:只需留一个空行即可。
让我们看看您的示例中发生了什么。反斜杠被定义为在Verbatim
块中也起作用以转义命令。!
首先使 等同于{
打开组,然后立即使它等同于}
关闭组。因此,您将无法将多标记参数传递给宏,因为您没有左参数分隔符。
当\phantom{bar}
被处理时,\phantom
会正常执行(反斜杠已被赋予其正常含义),并且它会找到一个{
前面没有左参数分隔符的标记。请记住,我们处于逐字模式!因此{
被视为 的参数\phantom
,并产生一个相当于字母的空格。然后bar}
被逐字打印。
您的尝试
\phantom!bar!
不起作用,因为它相当于在 之外Verbatim
,\phantom}bar}
这是非法的。
commandchars=\\\!\?
和
\phantom!bar?
我们 所做 的 是 在 正常 情况 下 应该 做 的 事情\phantom{bar}
.
答案2
我了解到许多 latex 命令都存在问题,例如\phantom
与命令字符组块的理念不兼容。这里的解决方法是定义一个无参数的辅助命令,如下所示:
\newcommand{\worstLanguageEver}{\phantom{I}}
\begin{Verbatim}[commandchars=\\\$\$]
\worstLanguageEver
trait Sys[S <: Sys[S]] {
type ID <: Ident[S#Tx]
type Tx
}