Eureka
Eureka
这家伙很懒,什么也没写!

注册于 3年前

回答
25
文章
0
关注者
1

先 Mark 一下。其实可以用 TikZ 生成 PDF 动图的,有空了我来补充上具体方法。

下次请给完整的代码,可以参考一下下面的代码:

\documentclass{article}
\usepackage{amsmath}
\begin{document}

\begin{equation*}
r_s = 1 - \dfrac{\displaystyle 6\sum_{i=1}^n}{n(n^2 - 1)}
\end{equation*}
\end{document}

效果:
image.png

但是我觉得这样真的不好看 ...

默认的格式不满足你的需求,那么你可以自定义, 修改下面这行内容就行了:

\kern10ex\inserttocsection\par}

比如我这里修改成了 10ex, 可自行修改为你喜欢的宽度. 完整代码如下:

\documentclass{beamer}
\setbeamertemplate{section in toc}{%
    \leavevmode\leftskip=1.75ex%
  \llap{%
    \hbox to 2.25ex{\hfil\inserttocsectionnumber.\hfil}}%
  \kern10ex\inserttocsection\par}

\begin{document}
\frame{
  \contentsname
  \tableofcontents
}

\section{sectionone}
\frame{\frametitle{sectionone}some text}

\section{sectiontwo}
\frame{\frametitle{sectiontwo}some text}
\end{document}

你也可以写得再规范一点, 就像下面这样:

\documentclass{beamer}
\defbeamertemplate{section in toc}{Your style}{%
    \leavevmode\leftskip=1.75ex%
  \llap{%
    \hbox to 2.25ex{\hfil\inserttocsectionnumber.\hfil}}%
  \kern10ex\inserttocsection\par}
\setbeamertemplate{section in toc}[Your style]

\begin{document}
\frame{
  \contentsname
  \tableofcontents
}

\section{sectionone}
\frame{\frametitle{sectionone}some text}

\section{sectiontwo}
\frame{\frametitle{sectiontwo}some text}
\end{document}

二者的效果是一致的, 编译结果如下:
image.png

使用 LaTeX 自带的 picture 环境 + LaTeX 3 手搓了一个, 没有使用其它的任何宏包. 且带圈数字的大小会根据当前文档的字体大小自动调整.

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lipsum}
\usepackage{xcolor}

\ExplSyntaxOn\makeatletter
\NewDocumentCommand{\circlenum}{O{black}m}
  {
    \__circle_num:nn {#1}{#2}
  }

%%%%%    box typesetting config   %%%%%
\fp_const:Nn \c__circle_num_scale_fp { .85 }
\dim_const:Nn \c_circle_num_wd_dim { \f@size pt }
\dim_const:Nn \c__circle_num_typeset_box_dp { 1.6pt }
%%%%%    box typesetting config   %%%%%
\box_new:N \l__circle_num_box
\box_new:N \l__circle_num_typeset_box
\cs_set_protected:Npn \__circle_num:nn #1#2
  {
    % scale number
    \hbox_set:Nn \l__circle_num_box { #2 }
    \fp_set:Nn \l_tmpa_fp
      {
        \dim_ratio:nn
          { \fp_use:N \c__circle_num_scale_fp\c_circle_num_wd_dim }
          { \box_wd:N \l__circle_num_box }
      }
    \box_scale:Nnn \l__circle_num_box
      {
        \fp_min:nn {\fp_use:N \l_tmpa_fp}{1}
      }{ 1 }
    % typeset cirle num
    \exp_args:Nne \__circle_num_typeset:nnN
      { \c_circle_num_wd_dim }
      { #1 }
      \l__circle_num_box
  }
\cs_new:Npn \__circle_num_typeset:nnN #1#2#3
  {% #1:radius(float); #2:style; #3:content
    \hbox_set:Nw \l__circle_num_typeset_box
    \begin{picture}(0pt, 0pt)(\dim_eval:n {-\c_circle_num_wd_dim/2}, 0pt)
      \put(0, \dim_to_decimal:n {\dim_eval:n {#1/2 - \c__circle_num_typeset_box_dp}}) 
        { \color{#2}\circle{#1} }
      \put(0, 0) { \clap{\box_use_drop:N #3} }
    \end{picture}
    \hbox_set_end:
    \box_set_wd:Nn \l__circle_num_typeset_box 
      { \dim_use:N \c_circle_num_wd_dim }
    \box_set_ht:Nn \l__circle_num_typeset_box
      { 
        \dim_eval:n { \c_circle_num_wd_dim
          - \c__circle_num_typeset_box_dp }
      }
    \box_set_dp:Nn \l__circle_num_typeset_box 
      { \dim_use:N \c__circle_num_typeset_box_dp }
    \box_use_drop:N \l__circle_num_typeset_box
  }
\makeatother\ExplSyntaxOff


\begin{document}
\lipsum[1][1-2]

XXX, \kern2.3pt\relax1| 11| 111| 999| 9999| ZZZ

\def\vbar{\makebox[0pt]{|}}
\fboxsep0pt\relax
XXX, \fbox{\circlenum[blue]{11}}, \fbox{HxM}

XXX, \circlenum[red]{1}|\circlenum[blue]{11}|\circlenum[teal]{111}|%
\circlenum{\color{gray}999}|\circlenum[red]{\color{purple}9999}|\circlenum[yellow]{XXVII} ZZZ
\end{document}

如果用户需要自定义样式, 可以更改下面的配置:

%%%%%    box typesetting config   %%%%%
\fp_const:Nn \c__circle_num_scale_fp { .85 }
\dim_const:Nn \c_circle_num_wd_dim { \f@size pt }
\dim_const:Nn \c__circle_num_typeset_box_dp { 1.6pt }
%%%%%    box typesetting config   %%%%%

输出结果:
image.png

之前就说来回答的,拖了这么久 ...

代码如下:

\documentclass{article}
\usepackage[margin=2.5cm]{geometry}
\usepackage{tcolorbox}
\usepackage{minted}
\setminted{autogobble}
\usepackage{xsimverb}
\ExplSyntaxOn
\box_new:N \l__code_example_box
\NewDocumentEnvironment{codeexample}{!O{auxB.txt}}
  {
    \xsim_file_write_start:nn {\c_false_bool}{#1} 
  }{ 
    \xsim_file_write_stop:
    \hbox_set:Nn \l__code_example_box { \input{#1} }
    \dim_compare:nNnTF { \the \box_wd:N \l__code_example_box } > { .33\linewidth }
      { \begin{tcolorbox}[left=10pt, right=10pt] }
      { \begin{tcolorbox}[sidebyside, left=10pt, right=10pt] }
      \inputminted{latex}{#1}
      \tcblower
      \box_use_drop:N \l__code_example_box
    \end{tcolorbox}
  }
\ExplSyntaxOff


\begin{document}
\begin{codeexample}[code-example.tex]
  \begin{tikzpicture}
    \draw[draw, dashed] (0, 0) rectangle (3, 3);
    \draw[blue, ->] (0, 0) -- (2, 2);
  \end{tikzpicture}
\end{codeexample}

\begin{codeexample}
  \begin{tikzpicture}
    \draw[draw, dashed] (0, 0) rectangle (7, 7);
    \draw[red, ->] (0, 0) -- (6, 6);
  \end{tikzpicture}
\end{codeexample}
\end{document}

运行结果如下:

image.png

功能简述:

  • 接受一个可选参数用于控制代码抄录的文件名
  • 当 tikz 图片的(或其它object)的宽度超过 1/3\linewidth 时,采用上下排版;反之,采用左右排版.

你可以在这个基础上自己改进一下.

\documentclass{article}
\usepackage{aurical}
\usepackage{amsmath}
\usepackage{lipsum}
\DeclareSymbolFont{jana}{T1}{JanaSkrivana}{m}{n}
\DeclareSymbolFontAlphabet{\mathjana}{jana}

\begin{document}
\lipsum[1][1-4]

\[ 
\delta 1_{\{\lVert\delta\rVert\le1\}}\times(p-q)_t
+ (\delta 1_{\{\lVert\delta\rVert>1\}}\times p_t)
\]

\lipsum[1][5-8]

\[
\delta 1_{\{\lVert\delta\rVert\le1\}}\times(\mathjana{p}-\mathjana{q})_t
+ (\delta 1_{\{\lVert\delta\rVert>1\}}\times p_t)
\]
\end{document}

编译结果:
image.png

\measuredangle 对应 glyph 的具体定义在文件 mathsymb.mf 的 852 行,

%%% !!!
beginchar(measured_angle,12u#+2appr#,asc_height#,asc_depth#);
  "Measured angle sign";
  pickup tiny.nib;
  rt x1l=w-appr; lft x2l=appr; rt x3r=w-appr-hround 1.5u;
  bot y1l=bot y2l=0; top y3l=h+eps; pos1(rth,90);
  (x3r-x3l,y3l-y3r)=d_problem(z2l,y3l,x3r,rth-tiny);
  y2r=y1r; z2r-z3r=whatever*(z2l-z3l);
  filldraw stroke z1e--z2e--z3e;
  %
  numeric a;
  y2l=y5r; rt x5r=hround max(0.6[Appr,w-Appr]+0.5rth,x2l+0.5(h+d))+eps;
  pos5(rth,0);
  a=x5r-x2l; 0.5 y4=-d+eps; 0.5(x4-x2l)=a+-+min((0.5(y4-y2l)),a);
  0.5(z6-z2l)=a*dir min((angle(z3l-z2l)-angle(z4-z2l)),90);
  numeric t[];
  tmp_path:=halfcircle rotated -90 scaled 2(x5r-x2r) shifted z2r;
  tmpp_path:=reverse(halfcircle rotated -90 scaled 2(x5l-x2r) shifted z2r);
  t1=xpart(tmp_path intersectiontimes (z2l..z4));
  t2=xpart(tmp_path intersectiontimes (z2l..z6));
  z4r=point t1 of tmp_path; z6r=point t2 of tmp_path;
  t3=xpart(tmpp_path intersectiontimes (z2l..z6));
  t4=xpart(tmpp_path intersectiontimes (z2l..z4));
  z4l=point t4 of tmpp_path; z6l=point t3 of tmpp_path;
  filldraw subpath (t1,t2) of tmp_path
  --subpath (t3,t4) of tmpp_path--cycle;
  penlabels(1,2,3,4,5,6);
endchar;

似乎是需要用到 metatype1 ? 待续 ...


再次更新, 首先把 mathprmt.mf 复制到一个单独的文件夹出来(方便后期更改), 然后再把上述 measured_angle 的定义摘抄出来, 形成如下的文件:

%%%%%%%%%%%%%%          Preamble        %%%%%%%%%%%%%%
% 1. variables like: 'appr#' are inside it:
input mathprmt;  % load library 'mathbase.mf'

% 2. mode/math setup and function 'd_problem()' in 'mathsymb.mf'
mode_setup;
math_setup;
measured_angle := hex"3E";  % this variable must be known !!!
vardef d_problem(expr origin,top_lim,side_lim,breadth)=
  save a,b,c;
  a=abs((side_lim-xpart origin)/(top_lim-ypart origin));
  b=abs(breadth/(top_lim-ypart origin));
  begingroup
    vardef f(expr c)=
      (1+a**2-2a*b*c+(b*c)**2)*(c**2)<1
    enddef;
    c=solve f(0,breadth);
  endgroup;
  breadth*(c,1+-+c)
enddef;


%%%%%%%%%%%         Main doc        %%%%%%%%%%%%%%
beginchar(measured_angle,12u#+2appr#,asc_height#,asc_depth#);
  "Measured angle sign";
  pickup tiny.nib;
  rt x1l=w-appr; lft x2l=appr; rt x3r=w-appr-hround 1.5u;
  bot y1l=bot y2l=0; top y3l=h+eps; pos1(rth,90);
  (x3r-x3l,y3l-y3r)=d_problem(z2l,y3l,x3r,rth-tiny);
  y2r=y1r; z2r-z3r=whatever*(z2l-z3l);
  filldraw stroke z1e--z2e--z3e;
  %
  numeric a;
  y2l=y5r; rt x5r=hround max(0.6[Appr,w-Appr]+0.5rth,x2l+0.5(h+d))+eps;
  pos5(rth,0);
  a=x5r-x2l; 0.5 y4=-d+eps; 0.5(x4-x2l)=a+-+min((0.5(y4-y2l)),a);
  0.5(z6-z2l)=a*dir min((angle(z3l-z2l)-angle(z4-z2l)),90);
  numeric t[];
  tmp_path:=halfcircle rotated -90 scaled 2(x5r-x2r) shifted z2r;
  tmpp_path:=reverse(halfcircle rotated -90 scaled 2(x5l-x2r) shifted z2r);
  t1=xpart(tmp_path intersectiontimes (z2l..z4));
  t2=xpart(tmp_path intersectiontimes (z2l..z6));
  z4r=point t1 of tmp_path; z6r=point t2 of tmp_path;
  t3=xpart(tmpp_path intersectiontimes (z2l..z6));
  t4=xpart(tmpp_path intersectiontimes (z2l..z4));
  z4l=point t4 of tmpp_path; z6l=point t3 of tmpp_path;
  filldraw subpath (t1,t2) of tmp_path
  --subpath (t3,t4) of tmpp_path--cycle;
  penlabels(1,2,3,4,5,6);
endchar;
end


%%%% Compile it by %%%%%%
% mf measure_angle.mf
% gftodvi measure_angle.2602gf
% dvips measure_angle.dvi
% ps2pdf measure_angle.ps

依次使用如下的命令进行编译:

mf measure_angle.mf
gftodvi measure_angle.2602gf
dvips measure_angle.dvi
ps2pdf measure_angle.ps

然后你就可以看到 measure_angle.pdf 生成了, 截图如下:
image.png

目前想要在 TeX 中使用该符号还有两个问题:

  • 还需要生成对应的 tfm 文件, 或许还需要 .pk 文件;
  • 点阵字体不行, 可能需要用一点 metatype1 里面的东西;
  • 待续 ...

下面讲解如何在 LaTeX 中使用这个符号. 首先在生成对应的 .tfm 文件(TeX Font Metric), 使用如下命令:

mf '\mode=ljfour; input measure_angle.mf'

然后你会看到类似如下的日志输出:

$ mf '\mode=ljfour; input measure_angle.mf'
This is METAFONT, Version 2.71828182 (TeX Live 2026/dev/Arch Linux) (preloaded base=mf)
(measure_angle.mf (mathprmt.mf (mathbase.mf)) [62] )
Font metrics written on measure_angle.tfm.
Output written on measure_angle.600gf (1 character, 196 bytes).
Transcript written on measure_angle.log.

我们生成了 measure_angle.tfmmeasure_angle.600gf 两个文件(也许你生成的后一个文件中的数字不是 600, 或者干脆就没有 600 这个字样). 现在你就需要把上面的 *gf 文件转化为 .pk 文件(Packed Raster - 点阵), 使用如下的命令:

gftopk measure_angle.600gf measure_angle.600pk
注意: 如果你上一步生成的是 measure_angle.600gf 这种格式的文件, 那么上述的 .600pk 中的 600 则不能省略 !

随后在当前文件夹就会生成一个名为 measure_angle.600pk 的文件, 有了:

  • measure_angle.600pk
  • measure_angle.tfm

两个文件之后我们就可以在 LaTeX 中使用这个符号了, 使用方法如下:

\documentclass{article}

\newfont{\symbolangle}{measure_angle}
\newcommand{\measureangle}{{\symbolangle\char"3E}} % slot 编号请参见 measure_angle.mf 文件 
\begin{document}
A new symbol by MetaFont: \measureangle $A = 45^\circ$
\end{document}

其实也可以直接使用 *.mf 文件, 那么你的当前工作路径下必须要有:

  • mathbase.mf
  • mathprmt.mf
  • measure_angle.mf

三个文件(并不是那么的方便). 在第一次编译时,会自动生成对应的 tfmpk 文件, 之后编译时就不需要了. 第一次的编译日志大概长这样:

This is pdfTeX, Version 3.141592653-2.6-1.40.27 (TeX Live 2026/dev/Arch Linux) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2024-11-01> patch level 2
L3 programming layer <2025-01-18>
(/usr/share/texmf-dist/tex/latex/base/article.cls
Document Class: article 2024/06/29 v1.4n Standard LaTeX document class
(/usr/share/texmf-dist/tex/latex/base/size10.clo))
kpathsea: Running mktextfm measure_angle
mktextfm: Running mf-nowin -progname=mf \mode:=ljfour; mag:=1; ; nonstopmode; input measure_angle
This is METAFONT, Version 2.71828182 (TeX Live 2026/dev/Arch Linux) (preloaded base=mf)

(/home/<name>/Document/Temp/tex_program/mathabx/test/measure_angle.mf
(/home/<name>/Document/Temp/tex_program/mathabx/test/mathprmt.mf
(/home/<name>/Document/Temp/tex_program/mathabx/test/mathbase.mf)) [62] )
Font metrics written on measure_angle.tfm.
Output written on measure_angle.600gf (1 character, 196 bytes).
Transcript written on measure_angle.log.
mktextfm: /home/<name>/Document/Temp/tex_program/mathabx/test/measure_angle.tfm: successfully generated.

(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def) (./test.aux)
[1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./test.aux) ) <./measur
e_angle.600pk></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb><
/usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb>
Output written on test.pdf (1 page, 23647 bytes).
Transcript written on test.log.

第二次的编译日志大概长这样:

This is pdfTeX, Version 3.141592653-2.6-1.40.27 (TeX Live 2026/dev/Arch Linux) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2024-11-01> patch level 2
L3 programming layer <2025-01-18>
(/usr/share/texmf-dist/tex/latex/base/article.cls
Document Class: article 2024/06/29 v1.4n Standard LaTeX document class
(/usr/share/texmf-dist/tex/latex/base/size10.clo))
(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def) (./test.aux)
[1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./test.aux) )</usr/shar
e/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/share/texmf-dist/f
onts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-dist/fonts/type1/publ
ic/amsfonts/cm/cmsy7.pfb>
Output written on test.pdf (1 page, 31385 bytes).
Transcript written on test.log.

编译结果如下:
image.png

但是上面的符号在 pdf 里面看起来是比较奇怪的(但是它在纸张上的打印效果是很棒的), 因为它是点阵字体,想要它看起来光滑一点, 没有毛边,那么就需要去自己去修改

  • pdftex.map 文件, 如果你是用的是 pdfTeX 引擎
  • 或者是 xdvipdfm 的配置文件, 如果你使用的是 XeTeX 引擎.

上面其实还有一个问题 -- \measureangle 不能嵌套在公式环境中, 下次解决.

所以这次就写到这里了, 待续 ...


我又回来了, 这次我更新 Type1 字体相关的内容了. 有以下的几种方法可以把 MetaFont 转为 Postscript Type1 字体:

  • 使用 MetaType1) 项目提供的一系列脚本,它可以把 MetaPost 语法写的字体转为为轮廓字体. 我们这里是 MetaFont 语法的. 尽管它们二者语法重叠部分很多, 但是直接转换有时也会失败.
  • 使用 Metafog 程序把前述的 Postscipt 文件转为 Postscipt Type 1 字体. 参考文章: Generating Type 1 Fonts from METAFONT Sources
  • 使用 mftrace 程序(在 ubuntu 下可以直接 apt 安装, Archlinux 下可以使用哦个 yay 安装),直接把 MetaFont 文件转为 Postscript Type 1 字体, 此时它会生成 pfa(默认格式) 或 pfb 文件, 而 pfb 文件就可以直接写在 pdfTeX 的 map 文件中了.
  • 也尝试李阿姨的 e-MetaFont, 李阿姨用 C 重写了 MetaFont,他这个项目能够直接从 MetaFont 文件生成 OpenType/SVG/WOFF, OTF/TTF/PFB 等格式的字体. 我编译了一下,没有编译通过,难搞 :-<

前两种方法可能是年代过于久远,存在一系列的兼容性问题; 第四种方法编译不通过; 所以我们采用第三种方法.

宏包 mathabx 其实也生成了一系列的 *.pfb 文件, 在如下的位置: texlive\2024\texmf-dist\fonts\type1\public\mathabx-type1.

首先生成 *.pfb 文件, 使用如下命令:

mftrace --formats=pfb measure_angle.mf

然后就可以在 pdfTeX 下使用了,完整编译示例如下:

\documentclass{article}
\pdfmapline{+measure_angle < ec.enc < measure_angle.pfb}
\newfont{\symbolangle}{measure_angle}
\newcommand{\measureangle}{{\symbolangle\char"3E}}

\begin{document}
A new symbol by MetaFont: \measureangle A$ = 45^\circ$
\end{document}

编译结果如下:
image.png

可以看到,已经成功了, 没有了上面点整字体的那种像素点了.

注意:这个转化效果其实是很差的, mftrace 没有很好地处理这个符号的轮廓, 采用前两种方法生成的轮廓就精确很多. 下面的图片摘自文章: Generating Type 1 Fonts from METAFONT Sources

摘自文章: Generating Type 1 Fonts from METAFONT Sources


这个答案目前存在的问题是很多的, 但是之后不会再更新了. 尽管存在许多的问题, 但是至少我们明白了一个字体(符号)是怎么设计的, 字体的配置文件是怎么写的, (La)TeX 是怎么调用这个字体的. 后续我应该会更新一系列的和字体相关的文章, 来系统地讲一讲 (La)TeX 中的字体知识.

大致思路如下:

image.png

Reference:

仅仅使用 tabular 来实现, 大概是下面这样:

\documentclass{article}
\usepackage{xcolor}
\usepackage{lipsum}


\begin{document}
\lipsum[1][1-3]
\begin{equation}
\def\arraystretch{1.7}
\addtolength{\tabcolsep}{-3pt}
\begin{tabular}{rlrllll}
  $\frac{1}{\sqrt{2}}y_1$   & $-$                  & $\frac{1}{\sqrt{2}}y_2 $ &     &       & = & $f_1$\\
  $\frac{1}{\sqrt{2}}y_1$   & $+$                  & $\frac{1}{\sqrt{2}}y_2 $ &     &       & = & $f_2$\\
                            & $\textcolor{red}{+}$ & $\frac{1}{\sqrt{2}}y_2 $ & $+$ & $y_3$ & = & $f_3$\\
                            & $\textcolor{red}{+}$ & $-\frac{1}{\sqrt{2}}y_2$ &     &       & = & $f_4$\\
  $\frac{1}{\sqrt{2}}y_1$   &                      &                          & $-$ & $y_3$ & = & $f_5$\\
  $-\frac{1}{\sqrt{2}}y_1$  &                      &                          &     &       & = & $f_6$\\
\end{tabular}
\end{equation}
\lipsum[1][4-6]
\end{document}

image.png

tabularalign 之类的直观一点, 就是会多打一些 $;如果想少打一些 &, $ 之类的符号,可以手搓一个表格数据解析的函数,但是感觉没必要(去用 tabularray 就好了)。

无非就是堆盒子嘛,不需要用 tikz 这种大杀器的, 也不需要用 l3coffin 之类的东西,虽然用这两个更加的简单. 代码如下:

\documentclass{article}
\usepackage[showframe, textwidth=18cm]{geometry}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage{lipsum}
\ExplSyntaxOn\makeatletter
\cs_set_protected:Npn \__item_align:nnn #1#2#3
  {% #1:cmd, #2:width, #3:object
    \hb@xt@#2{
      \tl_map_inline:nn {#3} 
        {
          \seq_put_right:No \l_tmpa_seq {\exp_not:N #1{##1}}
        } 
      \edef\seq@count{\seq_count:N \l_tmpa_seq}
      \seq_map_inline:Nn \l_tmpa_seq
        {
          \edef\item@width{\dim_eval:n {#2/(\seq@count+1)}}
          \hskip\item@width\clap{##1}
        }\hskip\item@width\hss
    }
  }
\NewDocumentCommand\itemAlign{O{}mm}
    {
        \__item_align:nnn {#1}{#2}{#3}
    }
\makeatother\ExplSyntaxOff
\parindent0pt

\begin{document}
\itemAlign{\linewidth}{A}\par
\itemAlign{\linewidth}{AA}\par
\itemAlign{\linewidth}{{(A)}{(A)}{(A)}}\par

\vskip6em
\dotfill\par
\def\imageA{\includegraphics[width=5em]{example-image-a}}
\def\imageB{\includegraphics[width=5em]{example-image-b}}
\itemAlign{\linewidth}{\imageA}\par
\itemAlign{\linewidth}{\imageA\imageA}\par
\itemAlign{\linewidth}{\imageB\imageB\imageB}\par
\itemAlign{\linewidth}{\imageB\imageB\imageB\imageB}

\vskip6em
\dotfill\par
\def\parA{\parbox[c]{12em}{\lipsum[1][1-2]}}
\def\parB{\parbox[c]{12em}{\lipsum[1][3-5]}}
\itemAlign[\sffamily]{\linewidth}{\parA}\par
\itemAlign[\color{red}]{\linewidth}{\parA\parA}\par
\itemAlign[\fbox]{\linewidth}{\parB\parB\parB}
\end{document}

编译结果如下:
image.png

注意事项:

  • 如果你想要更改 \itemAlign 第二个参数中对象的分割方式,可以把 \tl_map_inline:nn 换为 \clist_map_inline:nn 之类的函数.
  • 注意空格,任何显示的空格都会被 吞掉, 可以使用 \␣~ 替代.

不知道题主有没有解决这个 cref 的问题,所以我这里来推荐一下我自己写的这个模板,它可以很方便的处理上面的 定理类环境样式 定制与 cref 问题。

  • 在定理环境样式上,我这个模板提供了很多的接口: 标题格式定制,环境颜色控制, ....
  • cref 上,我这个模板内置了 cleverefzref-clever 两种兼容方案(因为最新的 cleveref 在中文环境下出了点问题)

使用我这个模板,对应的解决方案如下:

\documentclass[lang=cn, fancy]{ztex}
\makeatletter
\zthmstylenew{
  styleA={
    begin={
      \begin{tcolorbox}[
        enhanced jigsaw,
        breakable, sharp corners, 
        colframe=\thm@tmp@color, 
        top=2ex, boxrule=2pt, toprule=0pt, 
        fonttitle=\large\bfseries, colback=white, 
        attach boxed title to top left={xshift=3em,yshift=-\tcboxedtitleheight/2},
        coltitle=\thm@tmp@color, title={\zthmname~\zthmnumber},
        boxed title style={%
          empty, left=1pt, right=1pt, bottom=0pt,
          overlay={%
            \draw[color=\thm@tmp@color,line width=2pt,line cap=round]
            ([yshift=-1pt]frame.west)--
            ++(-2.9em,0) ([yshift=-1pt]frame.east)--
            ++(3em,0);
          }
        },
      ]
    },
    end = {\end{tcolorbox}},
  }
}
\makeatother
\zthmstyle{styleA}
\zthmlang{en}
\usepackage{zhlipsum}
\usepackage{lipsum}


\begin{document}
\section{FIRST}
\lipsum[1][1-2]
\begin{definition}[DEF-TEST]\label{def:A}
  \zhlipsum[1]
\end{definition}
\lipsum[1][3-5] -- \cref{thm:A}.


\vspace*{13em}
\section{SECOND}
\begin{theorem}[THM-TEST]\label{thm:A}
  \lipsum[1]
\end{theorem}
\lipsum[1][3-5] -- \cref{def:A}.
\end{document}
对应的样式代码是直接抄的 @u70550 的, 加了一丢丢的改动.

编译结果:
image.png

如果有兴趣使用我这个模板,我可以再发给你,因为目前我这模板还没有发布.

原始代码报错是因为 \nolinebreak 只能在水平模式使用, 而段首是垂直模式.几个注意的点:

  • 并不需要启用 expl3 环境;
  • 普通用户在导言区一般不使用 \RequirePackage, 而是 \usepackage 命令;
  • 在如今, g 参数不推荐使用, 类似的还有 G, l, u;
  • 不需要同时加载 colorxcolor, 单独一个 xcolor 已经足够.

修改后的代码如下:

\documentclass[a4paper]{ctexart}
\usepackage{xcolor}

\NewDocumentCommand \hh{m}{%
  \IfNoValueTF{#1}{%
    \,\underline{\hbox to 1cm{}}\,
  }{%
    \textcolor[rgb]{1.00,0.00,0.00}{\underline{#1}}%
  }%
}
\def\modeCheck{\ifvmode Vmode \else Hmode \fi}


\begin{document}
  删除这一行汉字会运行出错\hh{123}
  
  \hh{123}
  
  \modeCheck\modeCheck
\end{document}

运行结果:
image.png

一个基于 expl3 的方法如下:

\documentclass{article}
\usepackage{graphicx}

\begin{document}
\ExplSyntaxOn
\cs_generate_variant:Nn \prg_replicate:nn {e}
\cs_new:Npn \three_digits:n #1 
  {% to keep expandable
    \prg_replicate:en {3-\tl_count:n {#1}}{0} #1
  }
\newcommand\PDFInclude[2][1]{
    \int_step_inline:nnn {#1}{#2}{
        %\includegraphics[width=5cm]{
            \three_digits:n {##1}.pdf\par
        %}
    }
}
\ExplSyntaxOff
An simple TEST I as follows:\par
\PDFInclude{10}

An simple TEST II as follows:\par
\PDFInclude[95]{111}
\end{document}

运行结果如下:
image.png

你可以把上面的 \PDFInclude 命令自己加以改造以符合自己的需求.

在表格内部嵌套一个 bmatrix 就行了, 参见代码:

\documentclass{article}
\usepackage{booktabs}
\usepackage{amsmath}

\begin{document}
\begin{tabular}{cccc}
\toprule
$k$ & 0 & 1 & 2 \\
$\rho_k$ & $\begin{bmatrix}0\\1\\0\\0\end{bmatrix}$ & $\begin{bmatrix}0.3673\\0.3679\\0.1839\\0.0803\end{bmatrix}$ & $\begin{bmatrix}0\\0\\0\\1\end{bmatrix}$ \\ 
$\mu_k$ & 1 & 1 & 1 \\
\bottomrule
\end{tabular}
\end{document}

编译结果:
image.png

其实这几个问题的共同原因都在 \chapter 命令的定义中了, 参见 book.cls 中的定义:

\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
                   \thispagestyle{plain}%
                   \global\@topnum\z@
                   \@afterindentfalse
                   \secdef\@chapter\@schapter}

这个命令里面的 \thispagestyle{plain} 就产生了这个页码. 而对应的 \tableofcontents 的定义如下:

\newcommand\tableofcontents{%
   \if@twocolumn
     \@restonecoltrue\onecolumn
   \else
     \@restonecolfalse
   \fi
   \chapter*{\contentsname
       \@mkboth{%
          \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
   \@starttoc{toc}%
   \if@restonecol\twocolumn\fi
   }

这个里面调用的是 \chapter* 命令,其实就是上面的那个 \@schapter 命令. 所以说解决办法也就很简单了, 在一个局部里面, 把 \tableofcontents 内部的这个 \chapter* 改一下就行了. 你可以选择重定义前者,也可以选择重定义后者. 这里我使用前者:

\documentclass[landscape,openany]{book}
\usepackage[a6paper]{geometry}
\makeatletter
\renewcommand\tableofcontents{%
          \if@twocolumn
            \@restonecoltrue\onecolumn
          \else
            \@restonecolfalse
          \fi
          \@schapter{\contentsname
              \@mkboth{%
                  \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
          \@starttoc{toc}%
          \if@restonecol\twocolumn\fi
          }
\makeatother

\begin{document}
\pagestyle{empty}
\tableofcontents 

\chapter{First}
\chapter{Second}
\chapter{Third}
\chapter{First}
\chapter{Second}
\chapter{Third}
\chapter{First}
\chapter{Second}
\chapter{Third}
\end{document}

编译结果如下:
image.png

为了更好的理解这个问题,你可以试试下面这个例子:

\documentclass[landscape,openany]{book}
\usepackage[a6paper]{geometry}
\makeatletter

\begin{document}
\pagestyle{empty}
\@schapter{Contents}
\thispagestyle{plain} % comment this line to test page style
\@starttoc{toc}

\chapter{First}
\chapter{Second}
\chapter{Third}
\chapter{First}
\chapter{Second}
\chapter{Third}
\chapter{First}
\chapter{Second}
\chapter{Third}
\end{document}

至于你后面提到的 tocloft 宏包,你可以自己去看它的实现.

解答

你提问中的 cmu 疑似拼写有误? 回到问题本身:是这样的,你可以从原始的 Computer Modern math 中把 \int, \sum 这两个符号给 偷过来. 具体的示例如下:

% TeX-Program: pdflatex
\documentclass{article}
\usepackage{stix}
\DeclareSymbolFont{cmmlargesymbols}{OMX}{cmex}{m}{n}
\DeclareMathDelimiter{\Newint}{\mathop}{cmmlargesymbols}{"52}{cmmlargesymbols}{"5A}
\DeclareMathDelimiter{\Newsum}{\mathop}{cmmlargesymbols}{"50}{cmmlargesymbols}{"58}

\begin{document}
stix style int $\int_a^b$ and sum $\sum_a^b$:

\[
  \int_{a}^{b} x \;\mathrm{d}x = \sum_{i=1}^{\infty}\frac{x^2}{2} + C
\]

computer modern math style int $\Newint_a^b$ and sum $\Newsum_a^b$:
\[
  \Newint\nolimits_{a}^{b} x \;\mathrm{d}x = \Newsum_{i=1}^{\infty}\frac{x^2}{2} + C
\]
\end{document}

编译结果:
image.png

备注

  • 当然,你可以无脑使用 unicode-math 这个宏包,不过就需要使用 xetex 了,我这个方案的话,你可以在 pdftex 下进行编译.
  • 目前这个偷过来的方式比较的粗糙, 如果有后续要求,请继续提问

发布
问题