把3个参数的tcolorbox和newdocumentenvironment换成2个参数

发布于 2024-12-21 19:47:40

网上抄了个定理环境,在mwe中,导言区用\NewTColorBox创建了一个3个参数的彩色盒子theobox,参数#1是title的内容,参数#2是title的前缀,也就是定理环境名,参数#3我不明白是什么意思,看上去是来自tcolorbox封装的xparse命令。

我的想法是:

  1. 参数#2是不必要的,因为我的正式文档中只需要“考点”这两个字,而title的展现形式为考点\thesection\kern1em<#1,标题的内容>。但是如果我不改变参数的数量为2个,那么我每次就都要输入三个参数,而第二个参数只能用{考点},这样很麻烦。
  2. 直接把
IfNoValueTF={#1}{title=#2~\thetheorem.}{title=#2~\thetheorem\kern1em~#1},
IfNoValueTF={#3}{}{#3}%第三个参数省略- NoValue -返回

里面的#2换成考点两个字,会让我每次输入一个空分组来表示第二个参数,这样很不直观,且容易出错。

所以我希望能把3个参数的盒子theobox和3个参数的环境theorem都换成2个参数,也就是让原来的参数#2消失,保留作为标题的内容和盒子的内容的两个参数#1和#3。这样我只需要输入标题的内容和盒子的内容就可以了。

下面是mwe文件。

mwe241221.tex

查看更多

关注者
0
被浏览
1.7k
2 个回答
Sagittarius Rover
Sagittarius Rover 2024-12-21
这家伙很懒,什么也没写!

我想这是你想要的...其实没必要在tcb外面封装成amsthm(这让代码变得很不优雅,既然amsthm要套tcb),tcb本身也支持计数器的使用,著名的elegantbook模板的fancy样式对定理环境的实现也只是纯tcolorbox。我同时还把mwe更精简了一丢丢...

P.S. xparse已经进入latex kernel,因此不需显式调用。你可以texdoc xparse看看参数,lshort-zh-cn其实有简单的介绍,所谓的\NewTColorBox也不过是tcb版本的newenvironment而已。

image.png

\documentclass[10pt]{ctexbook}
\usepackage[margin=1in,showframe]{geometry}
\usepackage[most]{tcolorbox}
\usepackage{varwidth}
\usepackage{amsmath}
\usepackage{enumitem}
\setlist[enumerate]{leftmargin=1em}
\definecolor{mygreen}{RGB}{0,166,82}
\NewTColorBox[auto counter,number within=section]{theobox}{O{}}{% o省略可能的参数
  enhanced,frame empty,interior empty,
  coltitle=white,fonttitle=\bfseries,
  colbacktitle=mygreen,rounded corners,
  extras broken={frame empty,interior empty},
  borderline={0.25mm}{0mm}{mygreen},
  breakable,top=4mm,before skip=3.5mm,
  attach boxed title to top left={yshift=-3mm,xshift=5mm},boxed title style={boxrule=0pt,sharp corners=all},varwidth boxed title,
  title={考点\thetcbcounter\quad{#1}},
}
\newcommand*{\insertxt}{%
  \begin{enumerate}
    \item 素质教育以提高国民素质为根本宗旨。
    \item 素质教育是面向全体学生的教育。
    \item 素质教育是促进学生全面地、生动活泼地、可持续地发展的教育。
    \item 素质教育是促进学生个性发展的教育。
    \item 素质教育要着力提高学生的社会责任感、创新精神和实践能力。素质教育要着力提高学生的社会责任感、创新精神和实践能力。素质教育要着力提高学生的社会责任感、创新精神和实践能力。素质教育要着力提高学生的社会责任感、创新精神和实践能力。
  \end{enumerate}
}
\begin{document}
\chapter{你好}
\section{世界}
\begin{theobox}
  \insertxt
\end{theobox}
\begin{theobox}[有标题]
  \insertxt
\end{theobox}
\section{世界}
\begin{theobox}[有标题盒子]
  \insertxt
\end{theobox}
\begin{theobox}
  \insertxt
\end{theobox}
\chapter{你好}
\section{世界}
\begin{theobox}[有标题盒子]
  \insertxt
\end{theobox}
\begin{theobox}
  \insertxt
\end{theobox}
\begin{theobox}[有标题盒子]
  \insertxt
\end{theobox}
\begin{theobox}
  \insertxt
\end{theobox}
\end{document}

image.png

远方不远
远方不远 2026-01-19
Hello, LuaLaTeX!

\NewTColorBox 定义的 theobox 盒子和由 \NewDocumentEnvironment 定义的 theorem 环境,二者的参数格式是完全一致的,都是 o m +o

要把三个参数改为两个参数,并去除参数 #2 ,那么只需要把 theobox 盒子的定义中的 #2 全部改为固定文本 考点 ,然后把 #3 全部改为 #2 ;同时将 theorem 环境的定义中的 [#2] 删除,并将 #3 改为 #2 。最后将两个定义中的参数格式对应定义分别改为 o +o 即可。

然而此时还有可优化空间。修改后的 theorem 环境中定义的 #2 实际上是环境的主体,应当使用 +b ,需要将 [#2] 改为 #2 ,参数仍然为 2 个,这样一来,修改后的 theobox 盒子的定义中的 #2 的空值判断也就没有意义了,应当删除这行空值判断代码,所以参数被优化为仅有 1 个。

主要修改代码如下:

\NewTColorBox{theobox}{o}{%
  enhanced,
  frame empty,
  interior empty,
  coltitle                       = white,
  fonttitle                      = \bfseries,
  colbacktitle                   = mygreen,
  extras broken                  = {frame empty,interior empty},
  borderline                     = {0.25mm}{0mm}{mygreen},
  rounded corners,
  breakable                      = true,
  top                            = 4mm,
  before skip                    = 3.5mm,
  attach boxed title to top left = {yshift=-3mm,xshift=5mm},
  boxed title style              = {boxrule=0pt,sharp corners=all},varwidth boxed title,
  IfNoValueTF                    = {#1}{title=考点~\thetheorem.}{title=考点~\thetheorem\kern1em~#1}}

\NewDocumentEnvironment{theorem}{o +b}{%
  \refstepcounter{theorem}\begin{theobox}[#1]#2}{\end{theobox}}

代码测试:

\begin{theorem}[素质教育的内涵]
  \begin{enumerate}
    \item 素质教育以提高国民素质为根本宗旨。
    \item 素质教育是面向全体学生的教育。
    \item 素质教育是促进学生全面地、生动活泼地、可持续地发展的教育。
    \item 素质教育是促进学生个性发展的教育。
    \item 素质教育要着力提高学生的社会责任感、创新精神和实践能力。
  \end{enumerate}
\end{theorem}

效果图如下:

image.png

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览