tcolorbox newtcblisting“!扫描使用 \verbatim@start 时文件结束”

tcolorbox newtcblisting“!扫描使用 \verbatim@start 时文件结束”

我有以下代码片段:

\documentclass{article}
\usepackage[minted]{tcolorbox}

\newtcblisting{shell}[1][]{listing only, title={Output},
listing engine=minted, minted language=text}

\begin{document}

\begin{shell}
a {"John Marwood Cleese", 123456}
\end{shell}

\begin{shell}
{"John Marwood Cleese", 123456}
\end{shell}

\end{document}

第一个 shell 环境可以正确编译。但是第二个 shell 环境发出错误“ ! File ended while scanning use of \verbatim@start”。

有人能解释一下吗?

我想要的是:

\begin{shell}
{"John Marwood Cleese", 123456}
\end{shell}

我怎样才能让这段代码工作?非常感谢。

答案1

我猜你会在实际代码中使用可选参数,所以我不会告诉你删除它。

你可以使用该xparse库。为了进行实验,我使用可选参数来设置语言。

\documentclass{article}
\usepackage[minted]{tcolorbox}
\tcbuselibrary{xparse}

\NewTCBListing{shell}{!O{text}}{
  listing only,
  title={Output},
  listing engine=minted,
  minted language=#1,
}

\begin{document}

\begin{shell}
a {"John Marwood Cleese", 123456}
\end{shell}

\begin{shell}
{"John Marwood Cleese", 123456}
\end{shell}

\begin{shell}[tex]
a {"John Marwood Cleese", 123456}
\end{shell}

\begin{shell}[tex]
{"John Marwood Cleese", 123456}
\end{shell}

\end{document}

在此处输入图片描述

前面的可选参数规范!告诉 LaTeX,如果发现空格(或结束行),则不会查找可选参数。

限制:您不能说\begin{shell} [options]:可选参数必须附加到}。这似乎没什么大不了的。

的问题在于\newtcblisting{shell}[1][]{...}[将会忽略空格(或结束行),因此{在执行逐字模式的更改之前,已经扫描了前导。

答案2

以下操作通过删除可选参数来实现。如果没有它,就不会对 进行前瞻,这[将意外地标记{并将其类别代码冻结为 1(begin-group)。由于此类别代码冻结,逐字环境的参数抓取不起作用(相应的\end{shell}是本地组的一部分,因此对 TeX 的分隔参数扫描器隐藏)。

\documentclass{article}
\usepackage[minted]{tcolorbox}

\newtcblisting{shell}{listing only, title={Output},
listing engine=minted, minted language=text}

\begin{document}

\begin{shell}
a {"John Marwood Cleese", 123456}
\end{shell}

\begin{shell}
{"John Marwood Cleese", 123456}
\end{shell}

\end{document}

如果您确实需要可选参数,那么您将有几个选择:

  • 自己实现参数抓取逻辑
  • 修补一些内部部件以使其正常工作
  • 使用一些即使被标记也不会造成伤害的东西

下面显示了最后一个选项,冻结\empty在后面步骤中将不再扩展的内容:

\documentclass{article}
\usepackage[minted]{tcolorbox}

\newtcblisting{shell}[1][]{listing only, title={Output},
listing engine=minted, minted language=text}

\begin{document}

\begin{shell}
a {"John Marwood Cleese", 123456}
\end{shell}

\begin{shell}
\empty{"John Marwood Cleese", 123456}
\end{shell}

\end{document}

但这恰恰表明了这个问题的一面:你总是必须小心谨慎地使用你的环境,以免造成伤害。最好使用强制参数(或者至少最后一个参数应该是强制参数)。

两者都显示以下输出:

在此处输入图片描述

相关内容