简单的 REPL 输出格式(xstring 和特殊字符)

简单的 REPL 输出格式(xstring 和特殊字符)

我想将 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. 这是完全错误的方法还是总体上朝着正确的方向发展?(如果错误:请忽略以下问题并仅提出更好的方法。)

  1. \IfBeginWith不会比较>,因此本示例!在输出中使用并替换它。(这会影响所有常见提示字符(>#$%)。我查看了xstring 文档虽然 §3.1.* 规定#可能%有问题,但从我的阅读来看>应该没问题。)

    ➜ 这个问题可以修复/使之正常工作吗>(可能其他的也可以)?

  2. <输入时出现错误。它会发出警告

    ! Undefined control sequence.
    <->\leavevmode \kern \z@ \char `\<
    

    并且根据其他未知因素,可能会或可能不会在输出 PDF 中产生正确的字符。(它在我的“完整”文档中打印正常(仍然会产生警告),但上面的 MWE 将其变成了。我尝试添加一些可能的候选包……不知道是什么“修复”了这个问题。)更改\FancyVerbFormatLine

    \IfBeginWith{\detokenize{#1}}{!}{\textbf{#1}}{#1}
    

    消除了警告,因此这再次xstring相关。

    ➜ 这里出了什么问题?我该如何解决?

  3. (非必要)虽然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}

相关内容