ctex 在 Linux 系统下默认使用 fandol 字库,这个字库的字体包含的字形比较少,换成其它字体就好。
ctex 在 Linux 系统下默认使用 fandol 字库,这个字库的字体包含的字形比较少,换成其它字体就好。
这两个宏都需要吃掉一个参数,并且完全展开这个参数。
第一个区别是,\use:e
(在要被完全展开的上下文中)可以被完全展开(expands all tokens fully),\use:x
不能被完全展开。
比如 \use:e { <tl> }
中 <tl>
就是“要被完全展开的上下文”,如果这里面有 \use:e
,它也会被完全展开,\use:x
则不会被展开。
例如,
% protected 宏 \__my_unexp: 在要被完全展开的上下文中不会被展开,保持原样
\cs_set_protected:Npn \__my_unexp: { do~something }
\tl_set:Nn \l__my_tl { do~other }
\use:e { \__my_unexp: \use:x { \l__my_tl } }
其结果是 \__my_unexp: \use:x { do~other }
,\__my_unexp:
和 \use:x
不会被展开,括号也不会被展开,但是 \l__my_tl
会被展开,这个展开是由 \use:e
引起的,而不是 \use:x
。
而
\use:e { \__my_unexp: \use:e { \l__my_tl } }
的结果是 \__my_unexp: do~other
,\__my_unexp:
不会被展开,但是里面的 \use:e
会被展开,它需要一个参数,即 \l__my_tl
,然后这个里面的 \use:e
展开它的参数 \l__my_tl
。
有没有办法阻止记号在要被完全展开的上下文中被展开呢?有。就是 \exp_not:N
和 \exp_not:n
(及其变体)。
\use:e { \__my_unexp: \exp_not:N \use:e { \l__my_tl } }
这样,里面的那个 \use:e
就不会被展开,但 \l__my_tl
会被外面那个 \use:e
展开,结果是 \__my_unexp: \use:e { no~other }
。
而
\use:e { \__my_unexp: \exp_not:n { \use:e { \l__my_tl } } }
结果是 \__my_unexp: \use:e { \l__my_tl }
,因为 \exp_not:n
的作用是让它的参数不被展开。
以上代码把外面的那个 \use:e
换成 \use:x
,结果完全相同。
另一个区别是,\use:x
的参数中,parameter(catcode=6),比如 #
,需要双写,但 \use:e
不需要,如:
\use:x { \cs_set:Npn \exp_not:N \__foo_do:n #1 { } }
\use:e { \cs_set:Npn \exp_not:N \__foo_do:n #1 { } }
第一行会报错。需要写成 ##1
。
除此之外,它们的作用完全相同。
l3kernel 昨天(2023-05-17,版本为 Released 2023-05-15)的更新中,要求引擎必须有 \expanded
primitive 了(从 TeXLive 2019 开始 pdfTeX、XeTeX、LuaTeX 都已经有这个 primitive 了),\use:e
也是使用 \expanded
实现的。
目前,有 e
变体的应当用这个变体,使用 \cs_generate_variant:Nn
时,也应生成 e
变体。
某些宏和 primitive,比如 \tl_set:Nx
、\cs_set_nopar:Npx
,它们内部使用的 primitive 已经完成了完全展开这个操作,所以不再需要使用 e
变体来展开。(当然不全是如此)
TeX(和 LaTeX)里关于“展开”的内容可以写一篇10页以上的文章了。
不必。
代码
unknown .code:n = \tl_set:Nn \l__myTest_标签_tl \l_keys_key_str
的作用是把 \l__myTest_标签_tl
设置为 \l_keys_key_str
而不是它的值。
在执行完 \keys_set:nn { myTest } { 馒头,序号=23 }
后,\l_keys_key_str
的值是最后那个键名,也就是 序号
。所以,\l__myTest_标签_tl
展开为 \l_keys_key_str
,然后 \l_keys_key_str
展开为 序号
,所以最终显示为了 序号
。
应该这么写
unknown .code:n = \tl_set:No \l__myTest_标签_tl { \l_keys_key_str }
% 或 \tl_set:NV .. 或 \tl_set:Nx .. 或 \tl_set_eq:NN ..
使用 \tl_set:No
,LaTeX 发现 馒头
这个键未定义(此时 \l_keys_key_str
的值已经是 馒头
),就先把 \l_keys_key_str
展开一次,其结果是 馒头
,然后把这个值保存到 \l__myTest_标签_tl
,就得到了想要的结果。
可类比于“浅拷贝”与“深拷贝”。\tl_set:Nn \l__myTest_标签_tl { \l_keys_key_str }
只是拷贝了“指针”而不是指针指向的值。
把计数器的值保存到 .aux
文件里。
\documentclass{article}
\makeatletter
% 保存那些要记录的计数器,它值的格式为 \ysk@savecurrcounter{counter1}\ysk@savecurrcounter{counter2}...
\newcommand{\ysk@totalcounters}{}
\AddToHook{enddocument/afterlastpage}{\ysk@totalcounters} % 所有页面都已经输出,但.aux文件还未关闭
\newcommand\ysk@settotalcounter[2]{\global\@namedef{total#1s}{#2}} % 在.aux文件内执行
% 这个命令放在 \ysk@totalcounters 里,由它实际保存计数器的最后一个值
\protected\def\ysk@savecurrcounter#1{\immediate\write\@auxout
{\string\ysk@settotalcounter{#1}{\number\value{#1}}}}
% 这个命令负责初始化并且全局地为 \ysk@totalcounters 添加新值
\newcommand{\ysk@initandaddtocounter}[1]{%
\ysk@settotalcounter{#1}{0}% 先暂时定义,以避免.aux不存在时出错
\xdef\ysk@totalcounters{\ysk@totalcounters\ysk@savecurrcounter{#1}}}
\NewDocumentCommand{\DeclareTotalCounters}{ >{\SplitList{,}} m } % 接受一个逗号分隔的列表
{\ProcessList{#1}{\ysk@initandaddtocounter}}
% \DeclareTotalCounters 只能用于导言区,\AtBeginDocument(begindocument 钩子)中也不行
\AddToHook{begindocument/before}{\RenewDocumentCommand{\DeclareTotalCounters}{m}{\ERROR}}
\makeatother
\newcounter{yskcount}
\newcounter{foocount}
\DeclareTotalCounters{yskcount,foocount}
\begin{document}
Total yskcount: \totalyskcounts.
Total foocount: \totalfoocounts.
\setcounter{yskcount}{9}
\stepcounter{yskcount} % yskcount=10
\setcounter{foocount}{42} % foocount=42
\end{document}
另外,参加 totalcount
和 xassoccnt
宏包。
bend left
和 bend right
可以设置值,弯曲方向与这个值有关。bend right=angle
就是 bend left=-angle
。
对于 bend left
具体来说就是:
从起点 A 到终点 B 引一条(有向)线段,线段的方向就是从起点到终点的方向(向量 AB);
把 bend left
给定一个值,比如 30,那么从 A 到 B 的那条(有向)曲线在 A 点的切线与 AB 的夹角就是 30°(逆时针为正)。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{angles,quotes}
\begin{document}
\begin{tikzpicture}
\coordinate(A) at (0,0); \node[left] at (A) {A};
\coordinate(B) at (3,0); \node[above right] at (B) {B};
\draw[thick,->] (A)--(B);
\draw[bend left=30, red] (A) to (B);
\draw[bend left=-30, blue] (A) to (B);
\draw[->](A)--+(30:1cm) coordinate (C);
\pic["$30^\circ$", draw,->, angle radius=.7cm] {angle=B--A--C};
\end{tikzpicture}
\end{document}
如果是 bend left=-30
,也就是 bend right=30
,就往顺时针方向取 30°,结果就是上图中蓝色那条线。
结果就是弯曲方向不仅与线段的方向有关,而且与给出的角度有关。
\documentclass{article}
% \usepackage{calc} % calc 必须放在前面
\usepackage{regexpatch}
\makeatletter
\NewCommandCopy{\gaddtolength}{\addtolength}
\xpatchcmd{\gaddtolength}{\advance}{\global\advance}{}{\ERROR}
\makeatother
\newlength\testlen
\begin{document}
\setlength\testlen{0pt}
\begingroup
\addtolength\testlen{10pt} % 局部设置
\endgroup
\the\testlen
\setlength\testlen{0pt}
\begingroup
\gaddtolength\testlen{10pt} % 全局设置
\endgroup
\the\testlen
\end{document}
\labelformat{计数器}{代码}
可以修改 \ref
的外形。对外形的修改在使用 \label
时就已经完成,直接写入到 .aux
文件里。
比如上一个问题 #如何输出一个行间的只显示计数器的数字的盒子 ,加上下面的代码,\ref
时就会加上 \fcolorbox
。
\labelformat{dycnt}{\fcolorbox{dyframecol}{dybackcol}{#1}}
#1
为 \thedycnt
。
\ref{<label>}
显示的内容实际上是 \r@<label>
的第一项,\r@<label>
由 \newlabel
定义,\newlabel
的第一个参数就是 <label>
,第二个参数就是 \r@<label>
的值,不加载 hyperref
时,它只有2项,加载 hyperref
时有5项。你可以查看 .aux
文件。
\r@<label>
的第一项在(前一次编译时)执行 \label{<label>}
时就已经确定了,(局部的)保存在 \@currentlabel
这个内部命令中。更详细的内容可以查看 source2e.pdf
和 hyperref.pdf
。
有多种实现方式。可以用 xcolor
的 \fcolorbox
,也可以用 tcolorbox
。
\documentclass{ctexart}
\usepackage{xcolor}
% \usepackage{hyperref}
\definecolor{dyframecol}{HTML}{8080FF}
\definecolor{dybackcol}{HTML}{E6E6FF}
\newcounter{dycnt}
%% 第一种
\counterwithin{dycnt}{section}
\renewcommand{\thedycnt}{\arabic{section}.\arabic{dycnt}}
\newcommand{\dy}{\leavevmode\refstepcounter{dycnt}\nobreak
\fcolorbox[HTML]{8080FF}{E6E6FF}{\thedycnt}~}
%% 第二种
\usepackage{tcolorbox}
\newtcbox[use counter=dycnt, number within=section,
number freestyle=\noexpand\arabic{section}:\noexpand\arabic{dycnt}]
{\Dybox}[1][]
{colframe=dyframecol, colback=dybackcol,
boxrule=0.4pt, boxsep=0pt, left=3pt,right=3pt,top=3pt,bottom=3pt,
sharp corners, on line, after=~, #1}
% \tcbset{IfBlankF/.code n args={2}{\ifblank{#1}{}{\pgfkeysalso{#2}}}} % 如果比TeXLive2023旧,加上这个
\newcommand{\Dy}[1][]{\Dybox[IfBlankF={#1}{label={#1}}]{\thedycnt}\ignorespaces}
\begin{document}
\section{节}
\dy \label{dy:1}这是一段文字
\dy 这是一段文字 \ref{dy:4}
\Dy 这是一段文字 \ref{dy:1}
\Dy[dy:4] 这是一段文字
\end{document}
用法有一点点区别。但效果都是一样的。
postnotes
宏包提供此功能。
\documentclass[UTF8]{ctexart}
\usepackage{tasks}
\usepackage{postnotes}
\postnotesetup{backlink}
\def\endnote{\postnote}
\def\theendnotes{\printpostnotes}
\usepackage{hyperref}
\begin{document}
\begin{tasks}(3)
\task 周穆王\endnote{陳永伯 原本有目無文。現據《道藏》本《曆世真仙體道通鑒》卷五補。}\label{005陳永伯}
\task 燕昭王
\task 彭祖
\task 魏伯陽
\end{tasks}
\newpage
\theendnotes
\end{document}
某些地方可能和 endnotes
不一样,需要自己调整。
改为
\begin{beamer}[fragile]
...
\end{beamer}
https://tex.stackexchange.com/questions/253760/
另外你 \usetikzlibrary{datavisualization}
写了两次。不能写在正文里,应该写在导言区。
titlesec
目前可能并不兼容 AMS 文档类:https://tex.stackexchange.com/questions/543478/
如果只是想改一下 \section
的字体,可以在导言区加上:
\makeatletter
% \def\contentsnamefont{\bfseries} % 如果要改Contents
\def\section{\@startsection{section}{1}%
\z@{.7\linespacing\@plus\linespacing}{.5\linespacing}%
{\normalfont\large\bfseries\centering}}
\makeatother
想把 Abstract 加粗,只要把你贴出的那段代码
\item[\hskip\labelsep\scshape\abstractname.]
里的 \scshape
改成 \bfseries
即可。最好在导言区重定义 abstract
环境,而不修改 amsart.cls
文件。
另外,如果要查看某个文档类里的某个命令或环境的定义,.dtx
文件不是最好的选择,它可能包含无关代码,查看对应的 .cls
文件即可。
把 xeCJK
改为 xeCJKfntef
即可。
\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
tcolorbox
里的 multicols
环境不能分页。
可以参考:https://tex.stackexchange.com/questions/304722
另外一种实现方式是,在 multicols
外面加上一个 tcolorbox
盒子。
见 https://gitee.com/Sophanatprime/cus/tree/dev/(或 https://github.com/Sophanatprime/cus/tree/dev)。
通过 patch multicols
环境,在它的外面套上一个盒子。
实现的代码在 cus.module.box.tex
文件里,支持 tcolorbox
盒子的代码在 cus.library.tcb.tex
文件里。
移植这个功能也不难。
这是因为每个汉字的高度和深度并不一定相同。都加上一个 \strut
就行了。
如果觉得 \strut
太大,可以
\newcommand\mystrut{\vrule height .8em depth 0.2em width 0pt\relax}
自己调整 height
和 depth
到一个合适的值就行了。
问 linux系统下的生僻字不显示的问题