我有以下代码片段:
\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}
但这恰恰表明了这个问题的一面:你总是必须小心谨慎地使用你的环境,以免造成伤害。最好使用强制参数(或者至少最后一个参数应该是强制参数)。
两者都显示以下输出: