请问如何对我的定理环境中同样的代码合并,意思就是,把需要改动的部分定义为一个token进行封装,开放为类似ctexset那样的latex3键值列表,从而实现增删定理环境时都只需要增删一些键值就可以了,这是我的初步构想,有描述不清的地方还请见谅,但是大抵意思是这样的,因为我不会latex3也还不想学,太难了,所以希望大佬帮帮忙,我认为将这些定理环境封装为一个用户友好型的命令后是非常有用的.
提取码:1234
代码见cls
! 请原谅我总是有些奇怪的构想。
主要是这些需要改动:
1.定理名称与编号
2.定理label
3.定理环境名
4.颜色
还有一个问题,请问
这个盒子的跨页横线如何去掉,就是没有中间两条线段?
\documentclass{ctexbook}
\usepackage[left=2cm,right=2cm,top=.6cm,bottom=2.2cm]{geometry}
\usepackage{amsmath,amsthm}
\usepackage{xcolor,ninecolors}
\usepackage{tikz}
\usetikzlibrary{shadows}
\usepackage[most]{tcolorbox}
\usepackage{zhlipsum}
\makeatletter
\definecolor{CyaN}{HTML}{dbe1e5}
\colorlet{OrangE}{yellow!20!orange}
\colorlet{BluE}{cyan!70!blue}
\colorlet{ReD}{red!20!orange}
\colorlet{GreeN}{yellow!40!green}
\definecolor{nuanbai}{HTML}{f5f5f5}
\tcbset{my@basic@thm/.style={enhanced jigsaw, breakable,
enlarge left by=-3.5mm, width=\textwidth+3.5mm, boxrule=0pt,
top=2pt, bottom=2pt, left=2.5mm, frame hidden}}
\newcommand{\@my@newtheorem@n}[1]{\ERROR}
\newcommand{\@my@newtheorem@nn}[2]{%
\@ifundefined{#1}{\@my@newtheorem{#1}#2}{\@my@renewtheorem{#1}#2}}
\NewDocumentCommand{\@my@newtheorem}{ m m o +m }
{\IfNoValueTF{#3}{\newtheorem{#1}{#2}}{\newtheorem{#1}{#2}[#3]}%
\tcbset{my@#1@thmstyle/.style={#4}}%
\tcolorboxenvironment{#1}{my@basic@thm, my@#1@thmstyle}}
\NewDocumentCommand{\@my@renewtheorem}{ m m o +m }
{\IfNoValueTF{#3}{\renewtheorem{#1}{#2}}{\renewtheorem{#1}{#2}[#3]}%
\tcbset{my@#1@thmstyle/.style={#4}}}
\tcbset{my@basic@tcbthm/.style={detach title,}}
\newcommand{\@my@newtcbtheorem@n}[1]{\@my@newtcbtheorem@nn{#1}{}}
\newcommand{\@my@newtcbtheorem@nn}[2]{%
\@ifundefined{#1}{\@my@newtcbtheorem{#1}{#2}}{\@my@renewtcbtheorem{#1}{#2}}}
\newcommand{\@my@newtcbtheorem}[2]{%
\tcbset{my@#1@tcbthmstyle/.style={#2}}%
% 这个地方把标题保存到 \tcbtitletext 里,在后面的 overlay 需要对应修改,
% 其它不变的内容放在单独的样式里就好
\NewTColorBox{#1}{ O{} O{} o }
{my@basic@tcbthm, my@#1@tcbthmstyle, title={##2}, IfNoValueF={##3}{label={##3}}, ##1}}
\newcommand{\@my@renewtcbtheorem}[2]{\tcbset{my@#1@tcbthmstyle/.style={#2}}}
\pgfkeys{/mytcbtheorem/.is family}
\newcommand{\mytcbtheoremset}{\pgfqkeys{/mytcbtheorem}}
\ExplSyntaxOn
\cs_new_protected:Npn \mynewtheorem
{ \keyval_parse:NNn \@my@newtheorem@n \@my@newtheorem@nn }
\cs_new_protected:Npn \mynewtcbtheorem
{ \keyval_parse:NNn \@my@newtcbtheorem@n \@my@newtcbtheorem@nn }
\ExplSyntaxOff
\makeatother
%% 定义定理
\mynewtheorem{
defi={\textbf{定义}}[section]{colback=CyaN!80, borderline west={1.5mm}{0mm}{ReD}},
thm={\textbf{定理}}[section]{colback=CyaN, borderline west={1.5mm}{0mm}{CyaN!80!black}},
lem={\textbf{引理}}[section]{colback=CyaN!80, borderline west={1.5mm}{0mm}{BluE}},
prop={\textbf{命题}}[section]{colback=CyaN!80, borderline west={1.5mm}{0mm}{OrangE}},
exam={\textbf{题}}[chapter]{colback=CyaN!80, borderline west={1.5mm}{0mm}{DarkGreen}},
cor={\textbf{推论}}[chapter]{colback=CyaN!80, borderline west={1.5mm}{0mm}{violet}},
}
\renewcommand{\proofname}{\textbf{证明.}}
\newtheorem*{remark}{\textbf{注}}
\makeatletter
\newcommand{\my@theorem@overlay@unbroken}{
%%============== First ==============%%
\fill[black!60] ([xshift=1cm,yshift=5pt]frame.north west)-- ([xshift=0.8cm,yshift=0cm]frame.north west)--([xshift=1.2cm,yshift=0cm]frame.north west)--cycle;
\node[rectangle, text=white, drop shadow={opacity=.3, shadow xshift=0.1cm}, inner sep=1.5mm,fill=purple5,
anchor=west,rounded corners=3pt,font=\normalsize] at ([xshift=0cm,yshift=-3.mm]frame.north west) {\phantom{\rule{1.2em}{0pt}}\bf \Theorem\ \thetcbthm.~\tcbtitletext};
\fill[color=purple5,drop shadow={opacity=0.3,shadow xshift=.3pt}]
([xshift=1cm,yshift=5pt]frame.north west) {[rounded corners=3pt]--++(-1cm-5pt,0)}--++(0,-1cm-5pt)--cycle;
\fill[color=black!60] ([xshift=-5pt,yshift=-1cm]frame.north west)--([xshift=0cm,yshift=-0.8cm]frame.north west)-- ([xshift=0cm,yshift=-1.2cm]frame.north west)--cycle;
%%============== End ==============%%
\fill[purple5,drop shadow={opacity=0.3,shadow xshift=-0.008\linewidth,shadow yshift=0.0016\linewidth}]
([xshift=-0.05\linewidth,yshift=-5pt]frame.south east) {[rounded corners=3pt]--++(0.05\linewidth+5pt,0)}--++(0,0.05\linewidth+5pt)--cycle;
\fill[black!60] ([xshift=-0.05\linewidth,yshift=-5pt]frame.south east) -- ([xshift=-0.04\linewidth,yshift=0pt]frame.south east)-- ([xshift=-0.06\linewidth,yshift=0pt]frame.south east)--cycle;
\fill[black!60] ([xshift=5pt,yshift=0.05\linewidth]frame.south east)-- ([yshift=0.04\linewidth]frame.south east) -- ([yshift=0.06\linewidth]frame.south east)--cycle;
}
\newcommand{\my@theorem@overlay@first}{
\fill[black!60] ([xshift=1cm,yshift=5pt]frame.north west)-- ([xshift=0.8cm,yshift=0cm]frame.north west)--([xshift=1.2cm,yshift=0cm]frame.north west)--cycle;
\node[rectangle, text=white, drop shadow={opacity=.3, shadow xshift=0.1cm}, inner sep=1.5mm,fill=purple5, anchor=west,rounded corners=3pt,font=\normalsize] at ([xshift=0cm,yshift=-3.mm]frame.north west) {\phantom{\rule{1.2em}{0pt}}\bf \Theorem\ \thetcbthm.~\tcbtitletext};
\fill[color=purple5,drop shadow={opacity=0.3,shadow xshift=.3pt}]
([xshift=1cm,yshift=5pt]frame.north west) {[rounded corners=3pt]--++(-1cm-5pt,0)}--++(0,-1cm-5pt)--cycle;
\fill[color=black!60] ([xshift=-5pt,yshift=-1cm]frame.north west)--([xshift=0cm,yshift=-0.8cm]frame.north west)-- ([xshift=0cm,yshift=-1.2cm]frame.north west)--cycle;
}
\newcommand{\my@theorem@overlay@last}{
\fill[purple5,drop shadow={opacity=0.3,shadow xshift=-0.008\linewidth,shadow yshift=0.0016\linewidth}]
([xshift=-0.05\linewidth,yshift=-5pt]frame.south east) {[rounded corners=3pt]--++(0.05\linewidth+5pt,0)}--++(0,0.05\linewidth+5pt)--cycle;
\fill[black!60] ([xshift=-0.05\linewidth,yshift=-5pt]frame.south east) -- ([xshift=-0.04\linewidth,yshift=0pt]frame.south east)-- ([xshift=-0.06\linewidth,yshift=0pt]frame.south east)--cycle;
\fill[black!60] ([xshift=5pt,yshift=0.05\linewidth]frame.south east)-- ([yshift=0.04\linewidth]frame.south east) -- ([yshift=0.06\linewidth]frame.south east)--cycle;
}
\newcounter{tcbthm}
\mytcbtheoremset{
theorem name/.store in=\Theorem,
theorem autoref name/.store in=\tcbthmautorefname,
theorem the counter/.store in=\thetcbthm,
theorem style/.code=\tcbset{my@theorem@tcbthmstyle/.style={#1}},
}
% 定义和设置tcb定理
\mytcbtheoremset{
theorem name=定理,
theorem autoref name=\bfseries 定理,
theorem the counter=\thesection.\arabic{tcbthm},
% theorem style={}, % 改变样式
}
\mynewtcbtheorem{
theorem={
arc=3pt,breakable,enhanced,colback=nuanbai,boxrule=0pt,top=8mm,
fuzzy shadow={-0.6mm}{0.6mm}{0mm}{0.3mm}{white!50!gray},% 上
fuzzy shadow={0.6mm}{-0.6mm}{0mm}{0.3mm}{fill=white!40!gray},%下
opacityframe=0, opacityback=0.98,
fontupper=\itshape, step={tcbthm},
before pre=\smallskip, after app=\smallskip,
overlay unbroken=\my@theorem@overlay@unbroken,
overlay first=\my@theorem@overlay@first,
overlay last=\my@theorem@overlay@last,
},
}
\makeatother
\begin{document}
\chapter{章}
\section{结}
\zhlipsum[1][name=zhufu]
\begin{thm}
\zhlipsum[1][name=zhufu]
\end{thm}
\begin{theorem}
\zhlipsum[2][name=zhufu]
\end{theorem}
\end{document}
这样定义的和你的效果一样:
把长的代码保存到一个命令里,把重复使用的保存到一个命令(或 style)里。
用到 LaTeX3 的只有一个地方。键值设置可以用 pgfkeys
实现,不需要用 LaTeX3。
下一个问题和这个问题无关,应该分别提问。
我修改了代码,可以使用 ys/frame/not at break
这个键来设置不显示断开位置的线,还增加了设置透明度的选项,用法如下:
\begin{tcolorbox}[enhanced,ys style,breakable,pad at break=2mm,
ys/frame/not at break,ys/frame/fill opacity=0.2]
\zhlipsum[2-20][name=zhufu]
\end{tcolorbox}
代码见 https://gitee.com/Sophanatprime/SomeTeXMacro/blob/main/style/tcbstyle1.tex
或 https://github.com/Sophanatprime/SomeTeXMacro/blob/main/style/tcbstyle1.tex
好的,谢谢老师! 很抱歉,为了省事就一起问了,下次不会了!
老师,还有很严重问题,就是您没有给我解决这个问题 :
如何实现对后一种定理样式的定理样式的简单套用, 就是您已经定义了定理样式,那么假设我想要定义一种新的定理环境,如命题,我需要在套用定理环境的样式基础上只对它的颜色进行修改,所以我想要像这样给出就可以定义这个新的命题环境,您看下是否可以做到?
就像这样
还漏了,花括号里面还要有
newtheorem name=\bf 定理
,然后把newtheorem name=proposition
改为newtheorem=proposition
@u45041 把原来的
\newcounter{tcbthm}
这行和后面的删掉。\tcbset{my@basic@tcbthm/.style={detach title,}}
这行后面一直到\ExplSyntaxOn
之前的替换为然后可以这样定义:
\mynewtcbtheorem
第一层的键名是环境名。原来的\Theorem
的改为了\theorem@name
,需要相应地调整。不支持\mynewctbtheorem{theorem/name=定理}
这么写。好的,我马上尝试!
老师,还是有个小问题,不大的问题,就是我加了这个
后,定理名称还是overlay里面那个
请老师您看下,如何对这份文件进行修改以解决一流的问题,就是,
提取码:1000
,应如何让'theorem@thmcolor' 与 'theorem@name'可以实现随着新定义环境改变而变化,就是说仍然使用原本的三个overlay代码,然而可以在该三个overlay中设置这样的键值使得他们和新定义的定理环境,比如我这里的proposition一起改变
@u45041 把那几个
\my@theorem@overlay...
改为带参数的命令就可以了,使用的时候就写改起来很简单,我就不贴了。可以自己加参数。
也可以把各种定理环境的
overlay
的样式保存到单独的样式里\tcbset{my@lemma@overlay/.style={...}}
。@u10307 如果要改颜色,再加一个参数就可以了。
老师,关键是那几个命令我不知道怎么加参数,惭愧,就是一旦加#1这种参数就会报错,否则就name和我自己加的参数就会无效,实在没辙啊