我有一些文本文件需要包含在文档中,最好使用fancyvrb
或fvextra
。我想突出显示这些文件中的某些行。确切的条件在这里并不重要,因为我的问题可以通过一个简化得多的示例来重现。
我尝试过以类似的方式结合xstring
起来fancyvrb
这个问题/答案。只要我使用Verbatim
环境并内联文本,一切都会正常工作。如果我从外部文件中获取完全相同的内容并使用 导入它们\VerbatimInput
,我会收到一条错误消息。为什么会这样?我该如何解决这个问题?
\documentclass{scrartcl}
\usepackage{filecontents}
\usepackage{xstring}
\usepackage{xcolor}
\usepackage{fancyvrb}
\renewcommand{\FancyVerbFormatLine}[1]{\IfBeginWith{#1}{a}{\textcolor{red}{#1}}{#1}}
\begin{filecontents}{test.txt}
a one
b two
a three
b four
\end{filecontents}
\begin{document}
\begin{Verbatim}
a one
b two
a three
b four
\end{Verbatim}
% \VerbatimInput{test.txt}
% will produce an error: Argument of \OT1\' has an extra }
\结束{文档}
答案1
如果我使用,则没有错误filecontents*
\begin{filecontents*}{\jobname.txt}
a one
b two
a three
b four
\end{filecontents*}
\documentclass{article}
\usepackage{xstring}
\usepackage{xcolor}
\usepackage{fancyvrb}
\renewcommand{\FancyVerbFormatLine}[1]{\IfBeginWith{#1}{a}{\textcolor{red}{#1}}{#1}}
\begin{document}
\begin{Verbatim}
a one
b two
a three
b four
\end{Verbatim}
\VerbatimInput{\jobname.txt}
\end{document}
(文件名并不重要,我选择\jobname.txt
确保不会破坏我编译示例的目录中的文件)。
请注意,该包filecontents
已过时。为什么使用filecontents
会产生问题?因为你得到了
%% LaTeX2e file `vweg.txt'
%% generated by the `filecontents' environment
%% from source `vweg' on 2022/12/13.
%%
a one
b two
a three
b four
这肯定不是你想要的,对吧?
另一方面,更为稳健的方法是expl3
:
\begin{filecontents}[overwrite]{\jobname.txt}
a one
b two
a three
b four
\end{filecontents}
\documentclass{article}
\usepackage{xcolor}
\usepackage{fancyvrb}
\ExplSyntaxOn
\RenewDocumentCommand{\FancyVerbFormatLine}{m}
{
\str_if_eq:eeTF { \str_head:n { #1 } } { a } { \textcolor{red}{#1}} {#1}
}
\ExplSyntaxOff
\begin{document}
\begin{Verbatim}
a one
b two
a three
b four
\end{Verbatim}
\VerbatimInput{\jobname.txt}
\end{document}
我离开了filecontents
,所以你会看到没有出现任何错误。
扩展版本以应对更多情况:
\begin{filecontents}[overwrite]{\jobname.txt}
a one
b two
a three
b four
\end{filecontents}
\documentclass{article}
\usepackage{xcolor}
\usepackage{fancyvrb}
\ExplSyntaxOn
\RenewDocumentCommand{\FancyVerbFormatLine}{m}
{
\str_case_e:nnF { \str_head:n { #1 } }
{
{ a } { \textcolor{red}{#1} }
{ b } { \textit{#1} }
{ \c_percent_str } { \textcolor{green!70!blue}{#1} }
}
{#1}
}
\ExplSyntaxOff
\begin{document}
\begin{Verbatim}
a one
b two
a three
b four
\end{Verbatim}
\VerbatimInput{\jobname.txt}
\end{document}