![使用 tcblisting 环境构建宏时不起作用](https://linux22.com/image/447635/%E4%BD%BF%E7%94%A8%20tcblisting%20%E7%8E%AF%E5%A2%83%E6%9E%84%E5%BB%BA%E5%AE%8F%E6%97%B6%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我想用 的tcblisting
环境创建一个宏tcolorbox
,如下所示,但失败了。这是什么原因?如何处理?
代码:
\documentclass[a4paper]{article}
\usepackage{geometry,tcolorbox}
\geometry{showframe}
\geometry{left=1cm,right=1cm,top=1cm,bottom=1cm}
\tcbuselibrary{listings}
\parindent0pt
\begin{document}
This works all right as expected.
\begin{tcblisting}{}
\rule{1in}{5pt}\\\parbox{1in}{some text}
\end{tcblisting}
Construct a macro with the above code, but the macro does not work, why and what is the solution?
\newcommand\qa[2][]{
\begin{tcblisting}{#1}
#2
\end{tcblisting}
}
\qa{\rule{1in}{5pt}\\\parbox{1in}{some text}}
\end{document}
答案1
逐字模式需要禁用或修改许多 TeX 功能和约定。
例如,您不想将反斜杠解释为引入命令,但也不想将换行符解释为实际生成新行;等等。
当 TeX 读取命令的参数时会发生什么?嗯,它使用其标准方式形成标记,而对于你的情况,你需要撤消这项工作,这在一般情况下是不可能的。你可以“字符串化”输入,但这会在控制序列后添加空格,并且换行符不会被保留,因为它们已被转换为空格甚至转换为\par
。例如输入
\ttfamily
\detokenize{a\xyz\uvw b
c}
会产生
我猜这不是你想要的。有一些技巧可以解决这个问题,例如,\lstinline{<verbatim material>}
但你不能在逐字材料中使用括号;listings
提供\lstinline<char><verbatim material><char>
代表<char>
未出现在逐字材料中的字符,但换行符不会被接受(实际上它们会导致错误消息)。
对于一般逐字材料来说,唯一安全的方法是使用环境形式。