本人自定义了一个\Exercise{}
的命令,现在需要在其参数内使用抄录环境,遇到以下几个问题:
\verb||
命令在\Exercise{}
中使用会报错Verb||
之后,会自动展开内部的宏(???)有没有办法实现\Verb|\lipsum|
得到抄录文本\lipsum
而不展开呢?\Exercise{}
中使用行间抄录环境verbatim
或者Verbatim
均报错.下面是MWE,谢谢
\documentclass[12pt]{ctexbook}
\usepackage[margin=1.1in]{geometry}
\usepackage{manfnt}
\usepackage{lipsum}
\usepackage{amsmath}
\usepackage{fancyvrb}
\usepackage[most]{tcolorbox}
\newcounter{Exercise}[chapter]
\renewcommand{\theExercise}{\thechapter.\arabic{Exercise}}
\ExplSyntaxOn
\NewDocumentCommand{\Exercise}{o m}{
\stepcounter{Exercise}
\begin{tcolorbox}[title = {\textbf{Exercise} \theExercise},breakable]
\IfNoValueF{#1}{
\prg_replicate:nn {#1} {\textdbend}
}
#2
\end{tcolorbox}
}
\ExplSyntaxOff
\begin{document}
\verb|\lipsum[1]|
\Verb|\lipsum[1]|
\begin{verbatim}
\begin{tcolorbox}[title = {\textbf{Exercise} \theExercise},breakable]
\IfNoValueF{#1}{\prg_replicate:nn {#1} {\textdbend}}#2
\end{tcolorbox}
\end{verbatim}
\begin{Verbatim}
\begin{tcolorbox}[title = {\textbf{Exercise} \theExercise},breakable]
\IfNoValueF{#1}{\prg_replicate:nn {#1} {\textdbend}}#2
\end{tcolorbox}
\end{Verbatim}
%\Exercise[2]{\verb|\xyz|}%报错
%问题2: 作为抄录环境 \Verb|\lipsum| 得到一段文本的意义是什么???
\Exercise[1]{ 这是一个 \Verb|\lipsum| }
\Exercise[1]{ 这是一个 \Verb|\char92 lipsum| }
%问题3: 希望插入行间抄录环境,但verbatim与Verbatim都无法实现,会报错
\Exercise[2]{这是一个抄录环境
% \begin{Verbatim} % error here
% \begin{tcolorbox}[title = {\textbf{Exercise} \theExercise},breakable]
% \IfNoValueF{#1}{\prg_replicate:nn {#1} {\textdbend}}#2
% \end{tcolorbox}
% \end{Verbatim}
}
\end{document}
汇总一下群友的讨论,虽然比较高深我没弄特别懂....
在某一些简单的情况下,如果只要求在嵌套环境内使用\verb||
的话,可以尝试使用fancyvrb
中提供的\Verb
命令.
如果只想要把抄录环境作为单独参数的话,可以考虑Eureka提出的使用expl3
中的\str_set:Nn
和\str_replace_all:Nnn
函数,如下图中的YourVerb
命令的定义. 同时还可以考虑鱼香肉丝没有鱼先生使用的xparse
宏包中提供的v
型参数,会将传入参数视为一个verbatim
环境,但不可以嵌套在其他命令中.
(特别感谢@u19850 指出错误,一开始弄混了expl3
中的V/v
以及xparse
中的V
,没有亲自尝试)
确实发现新大陆了,xparse
还支持这个v
代表抄录环境.
Eureka大神还指出可以使用xsimverb
宏包的\xsim_file_write_start:nx {\c_true_bool}{<filename>}
把环境内容输出到外部文件,然后用\inputverb
之类的命令读进来,如下这样做的话可以实现环境的嵌套.
% \RequirePackage{xsimverb}
\xsim_file_write_start:nx {\c_true_bool}{<file name>}
<content>
\xsim_file_write_stop:
lshort
实现的example
样例环境定义如下,对于verbatim
的封装使用到了\verbatim@processline
,\verbatim@start
等,我不懂(/(ㄒoㄒ)/~~)
\makeatletter
\newwrite\example@out
\newlength\savefboxrule
\newlength\savefboxsep
\edef\example@name{\jobname-example.aux}
\newenvironment{example}%
{\begingroup\@bsphack
\immediate\openout\example@out=\example@name
\let\do\@makeother\dospecials\catcode`\^^M\active
\def\verbatim@processline{\immediate\write\example@out{\the\verbatim@line}}%
\verbatim@start}%
{\immediate\closeout\example@out\@esphack\endgroup%
\trivlist\item\relax
\setlength{\savefboxrule}{\fboxrule}%
\setlength{\savefboxsep}{\fboxsep}%
\setlength{\fboxsep}{0.015\textwidth}%
\setlength{\fboxrule}{0.4pt}%
\fcolorbox[gray]{0}{0.95}{%
\begin{minipage}[c]{0.45\textwidth}%
\setlength{\fboxrule}{\savefboxrule}%
\setlength{\fboxsep}{\savefboxsep}%
\small\verbatiminput{\example@name}%
\end{minipage}%
}%
\hfill%
\fbox{%
\begin{minipage}[c]{0.45\textwidth}%
\setlength{\fboxrule}{\savefboxrule}%
\setlength{\fboxsep}{\savefboxsep}%
\setlength{\parskip}{1ex plus 0.4ex minus 0.2ex}%
\normalsize\input{\example@name}%
\end{minipage}%
}%
\endtrivlist
}
\makeatother
以上只是作为聊天记录的保存marked
如果要在tcb内部实现插入代码的话,tcb提供了listings
的功能(如下图所示),但是考虑到封装性此处的命令\Exercise
似乎并不太好简单地嵌入verbatim
的效果.