我想将 REPL 记录复制/粘贴到环境中并获得输入的最少突出显示。
预期结果:
\begin{repl}
> foo
bar
> baz < quux
fnord
\end{repl}
应该产生类似
>
foo
bar
>
baz < quux
fnord
(即逐字逐句的环境,用户输入是粗体,所有输出(包括提示>
)都是正常的。)
我想法这应该很容易用fancyvrb
和来做xstring
,但我能得到的最好的工作仍然存在问题:
\documentclass{article}
\usepackage{fancyvrb}
\usepackage{xstring}
\usepackage{tgcursor} % default fixed font doesn't bold(?)
\renewcommand{\FancyVerbFormatLine}[1]{%
\IfBeginWith{#1}{!}{> \textbf{\StrGobbleLeft{#1}{2}}}{#1}
}
\begin{document}
\begin{Verbatim}
! foo
bar
! baz < quux
fnord
\end{Verbatim}
\end{document}
输出
>
foo
bar
>
baz ␣quux
fnord
0. 这是完全错误的方法还是总体上朝着正确的方向发展?(如果错误:请忽略以下问题并仅提出更好的方法。)
\IfBeginWith
不会比较>
,因此本示例!
在输出中使用并替换它。(这会影响所有常见提示字符(>
、#
、$
、%
)。我查看了xstring 文档虽然 §3.1.* 规定#
可能%
有问题,但从我的阅读来看>
应该没问题。)➜ 这个问题可以修复/使之正常工作吗
>
(可能其他的也可以)?<
输入时出现错误。它会发出警告! Undefined control sequence. <->\leavevmode \kern \z@ \char `\<
并且根据其他未知因素,可能会或可能不会在输出 PDF 中产生正确的字符。(它在我的“完整”文档中打印正常(仍然会产生警告),但上面的 MWE 将其变成了
␣
。我尝试添加一些可能的候选包……不知道是什么“修复”了这个问题。)更改\FancyVerbFormatLine
为\IfBeginWith{\detokenize{#1}}{!}{\textbf{#1}}{#1}
消除了警告,因此这再次
xstring
相关。➜ 这里出了什么问题?我该如何解决?
(非必要)虽然
fancyvrb
允许用定义自定义逐字环境\DefineVerbatimEnvironment
,但\FancyVerbFormatLine
似乎会影响所有变体。有没有简单的有什么方法可以让它只影响我自定义的逐字环境?(如果只有一种困难的方法,那就不值得付出努力。)
答案1
显然,xstring
删除空间存在问题(但实际上并不是需要)。
\documentclass{article}
\usepackage{fancyvrb}
\usepackage{xparse}
\usepackage{tgcursor} % default fixed font has no bold
\ExplSyntaxOn
\RenewDocumentCommand{\FancyVerbFormatLine}{m}
{
\str_if_eq_x:nnTF { \tl_head:n { #1 } } { > }
{ > \bfseries \tl_tail:n { #1 } }
{ #1 }
}
\ExplSyntaxOff
\begin{document}
\begin{Verbatim}
> foo
bar
> baz < quux >> foo
fnord
\end{Verbatim}
\end{document}
请注意,您可以使用>
,但不能使用,xstring
因为在Verbatim
环境中>
处于活动状态;\str_if_eq:nnTF
比较与类别代码无关。
如果您需要使用标准Verbatim
命令(即使您不需要),也可以使用不同的环境:
\documentclass{article}
\usepackage{fancyvrb}
\usepackage{xparse}
\usepackage{tgcursor} % default fixed font has no bold
\newenvironment{shell}
{\VerbatimEnvironment
\let\FancyVerbFormatLine\shellformatline
\Verbatim}
{\endVerbatim}
\ExplSyntaxOn
\NewDocumentCommand{\shellformatline}{m}
{
\str_if_eq_x:nnTF { \tl_head:n { #1 } } { > }
{ > \bfseries \tl_tail:n { #1 } }
{ #1 }
}
\ExplSyntaxOff
\begin{document}
\begin{shell}
> foo
bar
> baz < quux >> foo
fnord
\end{shell}
\end{document}