使用 tcblisting 环境构建宏时不起作用

使用 tcblisting 环境构建宏时不起作用

我想用 的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>未出现在逐字材料中的字符,但换行符不会被接受(实际上它们会导致错误消息)。

对于一般逐字材料来说,唯一安全的方法是使用环境形式。

相关内容