我想用另一个字符替换环境>
中每行开头的字符。考虑:Verbatim
\documentclass{article}
\usepackage{fancyvrb,xstring}
\renewcommand{\FancyVerbFormatLine}[1]{%
\IfBeginWith{#1}{>}{t#1}{#1}
}
\begin{document}
\begin{Verbatim}
>est
\end{Verbatim}
\end{document}
这不起作用。也就是说:它用 编译pdflatex
,但用 什么也没发生>
:
答案1
在逐字环境中,某些字符被激活,以打破可能的连字。列表保存在\verbatim@nolig@list
定义为
\def\verbatim@nolig@list{\do\`\do\<\do\>\do\,\do\'\do\-}
这说明激活的字符是`
、<
、>
、,
'
。-
此外,空格也是活动的,除非要输出“可见空格”。
您的测试针对>
类别代码为 12 的进行检查,因此失败。获取活动角色的最常见技巧如下:\lowercase
仅更改角色代码,而不更改类别代码。
\documentclass{article}
\usepackage{fancyvrb,xstring}
\begingroup\lccode`~=`> % temporarily make ~ change into >
\lowercase{\endgroup
\renewcommand{\FancyVerbFormatLine}[1]{%
\IfBeginWith{#1}{~}{t#1}{#1}%
}%
}
\begin{document}
\begin{Verbatim}
>est
\end{Verbatim}
\end{document}
如果要用 替换>
,t
则必须避免扩展主动>
:
\documentclass{article}
\usepackage{fancyvrb,xstring}
\begingroup\lccode`~=`>
\lowercase{\endgroup
\saveexpandmode\noexpandarg
\renewcommand{\FancyVerbFormatLine}[1]{%
\IfBeginWith{#1}{~}
{\StrSubstitute[1]{#1}{~}{t}}
{#1}%
\restoreexpandmode
}%
}
\begin{document}
\begin{Verbatim}
>est
\end{Verbatim}
\end{document}
另一种方法是使用l3regex
。
\documentclass{article}
\usepackage{fancyvrb,xparse,l3regex}
\ExplSyntaxOn
\tl_new:N \l__hakon_line_tl
\cs_new_protected:Npn \hakon_change_gt:n #1
{
\tl_set:Nn \l__hakon_line_tl { #1 }
\regex_replace_once:nnN { \A > } { t } \l__hakon_line_tl
\tl_use:N \l__hakon_line_tl
}
%% \cs_set_eq:NN \FancyVerbFormatLine \hakon_change_gt:n
\NewDocumentCommand{\removeinitialgt}{ }
{
\cs_set_eq:NN \FancyVerbFormatLine \hakon_change_gt:n
}
\ExplSyntaxOff
\begin{document}
\begin{Verbatim}[formatcom=\removeinitialgt]
>est
\end{Verbatim}
\end{document}
\FancyVerbFormatLine
我没有使用全局更改,而是使用了 key。如果您想要全局重新定义,formatcom
只需取消注释定义上方的行即可。\removeinitialgt