检查逐字环境中的特殊字符

检查逐字环境中的特殊字符

我想用另一个字符替换环境>中每行开头的字符。考虑: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

相关内容