30 在封装的命令中使用\verb以及\Verb的区别

发布于 2024-08-20 17:29:33

本人自定义了一个\Exercise{}的命令,现在需要在其参数内使用抄录环境,遇到以下几个问题:

  1. \verb||命令在\Exercise{}中使用会报错
  2. 这里是列表文本修改为Verb||之后,会自动展开内部的宏(???)有没有办法实现\Verb|\lipsum|得到抄录文本\lipsum而不展开呢?
  3. 如何在\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}

查看更多

关注者
0
被浏览
642
1 个回答
Sagittarius Rover
Sagittarius Rover 2024-08-21
我要成为TikZ糕手/(ㄒoㄒ)/~~

汇总一下群友的讨论,虽然比较高深我没弄特别懂....
image.png

在某一些简单的情况下,如果只要求在嵌套环境内使用\verb||的话,可以尝试使用fancyvrb中提供的\Verb命令.

如果只想要把抄录环境作为单独参数的话,可以考虑Eureka提出的使用expl3中的\str_set:Nn\str_replace_all:Nnn函数,如下图中的YourVerb命令的定义. 同时还可以考虑鱼香肉丝没有鱼先生使用的xparse宏包中提供的v型参数,会将传入参数视为一个verbatim环境,但不可以嵌套在其他命令中.
(特别感谢@u19850 指出错误,一开始弄混了expl3中的V/v以及xparse中的V,没有亲自尝试)

image.png

image.png

确实发现新大陆了,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的效果.

image.png

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览