代码中的多出的长度正好是 \@pnumwidth
。这是因为没有正确设置目录中章的页码。
改为
\titlecontents{chapter}[0mm]
{\addvspace{0em}}
{\contentsmargin{0pt}\boxedd}
{\contentsmargin{0pt}\boxeddd}
{}
[\addvspace{0em}]
即可。
代码中的多出的长度正好是 \@pnumwidth
。这是因为没有正确设置目录中章的页码。
改为
\titlecontents{chapter}[0mm]
{\addvspace{0em}}
{\contentsmargin{0pt}\boxedd}
{\contentsmargin{0pt}\boxeddd}
{}
[\addvspace{0em}]
即可。
load
:该键只能作为宏包选项(或文档类选项)被设置;preamble
:该键只能在导言区设置;general
:该键只要有定义就能设置。
使用了 load
的键,只在使用 \SetKeys
时才能正确处理。使用 l3keys2e
宏包的设置键的命令不会正确处理。
使用了 preamble
的键,可以在导言区以及 begindocument/before
钩子(以及 etoolbox
的 \AtEndPreamble
)中被设置,无法在其它位置设置。
general
,清除 load
和 general
的效果,这是默认的情形。
设置 .usage:n
时,只是把键保存到 \l_keys_usage_load_prop
和 \l_keys_usage_preamble_prop
中,等到设置键时,再根据键是否在它们中而决定是否能被设置(实际上,在加载宏包、在导言区之后,会重新定义这两个 prop 里的键,使得它们无法再被设置)。
下例中,有两个位置出错,因为它们在不正确的位置设置了某些键。\DeclareKeys
和 \SetKeys
由 LaTeX2e 内核提供,模块名是可选参数。
\documentclass{article}
\begin{filecontents}[force]{mypkg.sty}
\DeclareKeys[mypkg]{
faa.store=\mypkgfaa,
faa.usage=load,
fbb.store=\mypkgfbb,
fbb.usage=preamble,
fcc.store=\mypkgfcc,
}
\ProcessKeyOptions[mypkg]
\end{filecontents}
\usepackage[faa=1,fbb=1,fcc=1]{mypkg}
\SetKeys[mypkg]{faa=2,fbb=2,fcc=2} % 出错:faa=2
\begin{document}
\SetKeys[mypkg]{fbb=3,fcc=3} % 出错:fbb=3
hello.
aa: \mypkgfaa,
bb: \mypkgfbb,
cc: \mypkgfcc.
\ExplSyntaxOn
\prop_show:N \l_keys_usage_preamble_prop
\ExplSyntaxOff
\end{document}
TeX 在获取命令的参数时,参数的 catcode 已经固定了,多个空格合并为一个,行结束符(一般是换行符)转为空格。所以再使用修改 catcode 的命令(比如 \obeyspaces
)已经无效了。
要么用环境,且不能用 b
参数,要么原样获取参数,然后重新扫描(使用 \scantokens
或 \tl_rescan:nn
及类似命令)。
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\NewDocumentCommand{\test}{ O{\linewidth} +v }
{
\coffin_clear:N \l_tmpa_coffin
\vcoffin_set:Nnn \l_tmpa_coffin {#1}
{ % 注意如果 \parindent>0pt 这里会有缩进
\small \ttfamily
\obeyspaces
\obeylines
\scantokens{#2}
\ignorespacesafterend
}
\coffin_typeset:Nnnnn \l_tmpa_coffin {H}{l}{0pt}{0pt}
}
\ExplSyntaxOff
\noindent % 移除段首缩进
\test{ha ha
hahahha
}
\end{document}
当然也还有其它办法,不过比这个略微复杂。
PS:使用 varwidth
还能有不一样的效果:
\documentclass{article}
\usepackage{varwidth}
\begin{document}
\ExplSyntaxOn
\NewDocumentCommand{\testa}{ O{\linewidth} +v }
{
\coffin_clear:N \l_tmpa_coffin
\hcoffin_set:Nn \l_tmpa_coffin
{
\varwidth [b] { \dim_eval:n {#1} }
\dim_set:Nn \parindent { \c_zero_dim }
\small \ttfamily
\obeyspaces
\obeylines
\scantokens{#2}
\endvarwidth
}
% \coffin_typeset:Nnnnn \l_tmpa_coffin {H}{l}{0pt}{0pt}
\coffin_display_handles:Nn \l_tmpa_coffin { blue }
}
\NewDocumentCommand{\testb}{ O{\linewidth} +v }
{
\coffin_clear:N \l_tmpa_coffin
\vcoffin_set:Nnn \l_tmpa_coffin {#1}
{
\dim_set:Nn \parindent { \c_zero_dim }
\small \ttfamily
\obeyspaces
\obeylines
\scantokens{#2}
\ignorespacesafterend
}
% \coffin_typeset:Nnnnn \l_tmpa_coffin {H}{l}{0pt}{0pt}
\coffin_display_handles:Nn \l_tmpa_coffin { red }
}
\ExplSyntaxOff
\noindent
\testa{ha ha
hahahha
}
\vspace{1cm}
\noindent
\testb{ha ha
hahahha
}
\end{document}
tabularray
不支持这么写。只能把结果保存到 tl 里,然后用 expand
键。
\documentclass{ctexart}
\usepackage{tabularray}
\SetTblrInner[tblr]{%
cells={c},
hlines,
vlines,
}
\begin{document}
\ExplSyntaxOn
\tl_clear:N \tableval
\seq_set_split:Nnn \l_my_a_seq { , }{ a,b,c,d,ef }
\int_step_inline:nnn { 1 } { \seq_count:N \l_my_a_seq }
{
\int_compare:nNnTF {#1} < { \seq_count:N \l_my_a_seq }
{
\tl_put_right:Nn \tableval { #1 & }
}
{
\tl_put_right:Nn \tableval { #1 \\ }
}
}
\int_step_inline:nnn { 1 } { \seq_count:N \l_my_a_seq }
{
\int_compare:nNnTF {#1} < { \seq_count:N \l_my_a_seq }
{
\tl_put_right:Nx \tableval { \seq_item:Nn \l_my_a_seq {#1} & }
}
{
\tl_put_right:Nx \tableval { \seq_item:Nn \l_my_a_seq {#1} }
}
}
\ExplSyntaxOff
\begin{tblr}[expand=\tableval]{}
\tableval
\end{tblr}
\end{document}
\.._put_left:Nn
,\.._put_right:Nn
等命令时,要注意先清空变量;\dim_compare:nNn..
时,第 1、3 个参数必须是具体的长度(或长度表达式);如此得到的\l_tmpb_clist
为:{11.5632pt,34.68959pt,23.12639pt}
本例中,在使用 \clist_sort:Nn
之前,你可以用 \clist_show:N \l_tmpb_clist
看看是不是你想的那个结果:
\clist_set:Nn \l_tmpa_clist { ha, hahaha, haha }
\clist_clear:N \l_tmpb_clist
\clist_map_inline:Nn \l_tmpa_clist
{
\clist_put_right:Nn \l_tmpb_clist
{
\hcoffin_set:Nn \l_tmpa_coffin {#1}
\dim_use:N \coffin_wd:N \l_tmpa_coffin
}
}
\clist_show:N \l_tmpb_clist
为什么结果不是 {11.5632pt,34.68959pt,23.12639pt}
而是
The comma list \l_tmpb_clist contains the items (without outer braces):
> {\hcoffin_set:Nn \l_tmpa_coffin {ha}\dim_use:N \coffin_wd:N \l_tmpa_coffin}
> {\hcoffin_set:Nn \l_tmpa_coffin {hahaha}\dim_use:N \coffin_wd:N \l_tmpa_coffin }
> {\hcoffin_set:Nn \l_tmpa_coffin {haha}\dim_use:N \coffin_wd:N \l_tmpa_coffin }
因为你用的是 \clist_put_right:Nn
,而
要把长度保存到 \l_tmpb_clist
里,而不是 \hcoffin_se...
,可以这样:
\clist_set:Nn \l_tmpa_clist { ha, hahaha, haha }
\clist_clear:N \l_tmpb_clist
\clist_map_inline:Nn \l_tmpa_clist
{
\hcoffin_set:Nn \l_tmpa_coffin {#1}
\clist_put_right:Nx \l_tmpb_clist
{ \dim_use:N \coffin_wd:N \l_tmpa_coffin }
}
\clist_sort:Nn \l_tmpb_clist
{
\dim_compare:nNnTF {#1} > {#2}
{ \sort_return_same: }
{ \sort_return_swapped: }
}
\documentclass{article}
% \usepackage{amsmath}
% \usepackage{unicode-math}
\begin{document}
\def\cdotss{\cleaders\hbox to 0.5em{\hfil$\cdotp$\hfil}\hskip 3.1em\relax}
\begin{equation}
9 \div 2 = 4 \cdotss 1
\end{equation}
\end{document}
间距自己改改就行了,0.5em 是点之间的间距,省略号的总长为 3.1em,3.1÷0.5=6···0.1,所以总共6个点,多余的 0.1em 作为空白,对半放在省略号的两边。
用一个计数器,每执行一次 mark,就增加 1,坐标点随之改变。
\documentclass[tikz]{standalone}
\usetikzlibrary{decorations.markings}
\usetikzlibrary{intersections,through,calc}
\newcounter{intercnt}
\begin{document}
\begin{tikzpicture}
\draw[->] (0,0) -- (8,0)node[right]{$X$};
\draw[->] (0,0) -- (0,3) node[right]{$Y$};
\draw [line width=1pt,name path=l] plot [domain=-0.16:3.6, samples=20] ({2*\x-0.2*(sin(atan(cos(\x r))))},{sin(\x r)+0.2*(cos(atan(cos(\x r))))});
\setcounter{intercnt}{0} % 初始化
\path [decorate, decoration={markings,
mark=between positions 0 and 1 step 1/5 with{
\stepcounter{intercnt} % 加 1
\edef\pointA{A-\arabic{intercnt}}
\edef\pointB{B-\arabic{intercnt}}
\draw[name path=v] (0,-5pt)--(0,26pt);
\draw [name intersections={of=v and l, by={\pointA}}][very thick,blue,fill=black] (\pointA) circle(2pt);
\draw [shift={(0,0)},teal!30,line width=0.5pt,name path=c](0,0)circle(0.6);
\draw [name intersections={of=v and c, by={\pointB}}][very thick,green,fill=black] (\pointB) circle(2pt);
}
}] {plot [domain=0:3.14, samples=10] ({2*\x-0.2*(sin(atan(cos(\x r))))},{sin(\x r)+0.2*(cos(atan(cos(\x r))))})};
\foreach \i in {1,...,\arabic{intercnt}}
{\node at (A-\i) {$A_\i$}; \node at (B-\i) {$B_\i$};};
\end{tikzpicture}
\end{document}
tabularray
做不到。LaTeX 格式下,现在所有在 CTAN 上发布的表格宏包都做不到自动在单元格中间断开。
ConTeXt 格式有几个表格可以做到,比如 https://wiki.contextgarden.net/TABLE 。
如果一定要在 LaTeX 中实现,可以参考
https://www.zhihu.com/question/592211454/answer/2957730520 。
code0 那个地方不是花括号,是方括号。
代码不要贴图片,不能复制。
箭头和圆一起画。
\documentclass[tikz,border=2pt]{standalone}
\usetikzlibrary {arrows.meta}
\usetikzlibrary{decorations.markings}
\usepackage{xfp}
\tikzset{paint/.style={ draw=#1!50!black, fill=#1!80 },
gray arrow/.style={>={Stealth[gray,inset=0pt, length=4pt, angle'=20]}},
}
\begin{document}
\begin{tikzpicture}
\draw [blue,line width=1pt]
plot [domain=-0.5:4.5, samples=60] (\x,\fpeval{1/(1+0.0075*10^{\x})});
\path [decorate, decoration={markings,
mark=between positions 0 and 1 step 1/30 with{
\draw[->, gray arrow] (0,0)--(0,10pt);
\draw[paint=yellow, line width=.5pt](0,0) circle (.5mm);
}
}] {plot [domain=0:4.25, samples=60] (\x,\fpeval{1/(1+0.0075*10^{\x})})};
\end{tikzpicture}
\end{document}
% \usepackage{hyperref}
\label{lb:a}
\hyperref[lb:a]{text}
即可显示 text
,并且有超链接。text
改成你想要的文字。
\keys_define:nn { my }
{
subset-1 .meta:n = {#1},
subset-2 .meta:nn = { you } {#1},
}
类似于
\keys_define:nn { my }
{
subset-1 .code:n = { \keys_set:nn { my } {#1} } ,
subset-2 .code:n = { \keys_set:nn { you } {#1} } ,
}
但可以正确处理其它几类设置键的命令(如 \keys_set_filter:nnn
)。
第二个问题,只要使用 .meta:n
定义 subset
键即可。
由 .meta:n
和 .meta:nn
这两个 property 定义的键的作用是把传给它们的值当作键值对来解析,区别是,前者定义的键在解析传进来的值时使用该键的模块名(定义该键时 \keys_define:nn
的第一个参数),后者使用给定的模块名。
LaTeX3 中一些 \.._map_...
函数是通过尾递归来实现的,\prg_break_point:Nn
用于标记循环要跳出时的位置,\prg_map_break:Nn
用于跳出循环。
先看一个例子,这是 \tl_map_function:nN
的简化版实现:
% \cs_new_eq:NN \prg_break_point:Nn \use_ii:nn
\cs_new:Npn \mytl_map_function:nN #1#2
{
\__mytl_map_function:Nn #2 #1 \q_recursion_tail \q_recursion_stop
\prg_break_point:Nn \mytl_map_break: { }
}
\cs_new:Npn \mytl_map_break: { \prg_map_break:Nn \mytl_map_break: { } }
\cs_new:Npn \__mytl_map_function:Nn #1#2
{
\quark_if_recursion_tail_stop:n {#2}
#1 {#2}
\__mytl_map_function:Nn #1
}
\__mytl_map_function:Nn
有两个参数,第一个是 function,第二个是 tl 的某一项。
比如 \mytl_map_function:nN { abcd } \tl_show:n
,\__mytl_map_function:Nn
第一个参数都是 \tl_show:n
,第二个参数依次是 a
,b
,c
,d
,\q_recursion_tail
。
当第二个参数不是 \q_recursion_tail
时,先执行 \tl_show:n { .. }
,然后继续执行 \__mytl_map_function:Nn
;当发现第二个参数是 \q_recursion_tail
时,它吞掉 \q_recursion_stop
及其之前的内容,尾递归结束。
但如果改为:
\cs_new:Npn \__my_if_not_c_show:n #1
{
\tl_if_eq:nnTF {#1} { c }
{ \mytl_map_break: }
{ \tl_show:n {#1} }
}
\mytl_map_function:nN { abcd } \__my_if_not_c_show:n
那么当第二个参数是 c
时,会直接跳出循环,跳出的位置正是 \prg_break_point:Nn
所在的位置。\prg_map_break:Nn
和 \prg_break_point:Nn
的第一个参数是用于标记不同类型的 map 的,\tl_map_...
是 \tl_map_break:
,\seq_map_...
则是 \seq_map_break:
。
相当于某些编程语言里的 goto
,只是 \prg_map_break:Nn
只能向后跳转。
这个例子同时也演示了 \quark_if_recursion_tail_stop:n
的用法。
在盒子中需要使用 \internallinenumbers
,不过在 breakable 的盒子中仍然会失败。
\documentclass{article}
\usepackage{lipsum}
\usepackage{lineno}
\usepackage{tcolorbox}
\begin{document}
\linenumbers
\lipsum[1]
\nolinenumbers
\begin{tcolorbox}[left=4mm,boxsep=1mm,boxrule=0.5mm]
\internallinenumbers
\addtolength\linenumbersep{5.5mm}% = left + boxsep + boxrule
\lipsum[2]
\end{tcolorbox}
\linenumbers
\lipsum[3]
\end{document}
在 TeX 中,每个盒子都有一个参考点(reference point):
(来自 The TeXBook 第 63 页)
旋转一个盒子就是以这个 reference point 作为参考点。
coffin 内部使用了一个盒子保存了用 \hcoffin_set:Nn
(\vcoffin_set:Nn
)输入的东西,旋转 coffin 就是直接旋转这个内部盒子(还会设置一些内部变量),旋转参考点也就是这个内部盒子的 reference point,而不是 coffin 的 handle(水平与垂直 pole 的交点,如 (hc,vc),可以参考 xcoffins.pdf
)。
实际使用时,选择哪个点作为参考点不是特别重要,poles 会跟着一起旋转,只会改变内部变量的值。而 join,attach,typeset 这些操作都是基于 pole 的,在旋转前后,poles 之间的相对位置保持不变,poles 与盒子的内容的相对位置也保持不变。
问 如何消除tcolorbox定制目录的badbox?