默认情况下,每页底部的文字都是对齐的,但不可能恰好每页文字的长度都一样,所以那些可以伸缩的空白就会根据需要而伸长或缩短。
你的这种情况可以设置章节标题前后的间距为固定长度,而不是弹性长度,或者不设置每页底部文字对齐。
前者可以通过 ctex
文档类或 titlesec
等提供的接口修改,后者只需在 \begin{document}
之前加上 \raggedbottom
。
默认情况下,每页底部的文字都是对齐的,但不可能恰好每页文字的长度都一样,所以那些可以伸缩的空白就会根据需要而伸长或缩短。
你的这种情况可以设置章节标题前后的间距为固定长度,而不是弹性长度,或者不设置每页底部文字对齐。
前者可以通过 ctex
文档类或 titlesec
等提供的接口修改,后者只需在 \begin{document}
之前加上 \raggedbottom
。
不是没起作用,而是 env/../before
和 env/../after
钩子的内容是在当前组中执行的,这里的 \bfseries
对整篇文档都生效,而不是只对 quote
环境生效。环境开始时会添加 \begingroup
,before
钩子在这个 \begingroup
之前执行,begin
钩子在这个 \begingroup
之后执行。因此 env/../begin
和 env/../end
钩子才是和环境的内容在同一个组。这些在文档 lthooks-doc 的 3.1.1 节有描述。
报错里看到 \test..
展开为了 inner sep=2
不代表 \node
读取键时看到了 \test..
展开后的结果,读取键时可能展开,也可能不展开,完全取决于实现。比如 \keys_set:nn
就不会展开键,\keys_set:ne
就会先展开第二个参数,再读取键。实际使用时不应当依赖于这一行为,如果没有特殊说明,总是应当认为既可能展开,又可能不展开,这样才能减少出错的概率。
先保存到盒子里就好了。
\newbox\mynotebox
\newenvironment{mynote}
{%
\begin{center} % 开始居中环境
\begin{lrbox}{\mynotebox} %% <- 这里
\begin{minipage}{0.9\textwidth} % 设置内容宽度为页面的 90%
\small\itshape % 设置内容为小字号和斜体
}
{
\end{minipage} % 关闭 minipage
\end{lrbox}%
\fbox{\box\mynotebox}
\end{center} %
}
XeTeX 支持 ttf、ttc、otf、otc 这四个 opentype 字体,应该不支持 TTE 字体。
𬬺(U+2CB3A)在扩展 E 区,SimSun-ExtB 支持这个字形,不过可能有版权问题。开源方案有:宋体字形,比如文津宋体 https://github.com/takushun-wu/ 。黑体字形,比如 Plangothic https://github.com/Fitzgerald-Porthmouth-Koenigsegg/Plangothic_Project 。支持的字符都比较全。还有中华书局宋体、TH-Tshyn 等字体,不过也可能有版权问题。
可以在字统网上查找字形 https://zi.tools/?secondary=ids ,
可以查到已经在 Unicode 里的字符,不在 Unicode 里的,也会给出组字的结果。如果不满意的话可以到 https://zhs.glyphwiki.org/wiki/GlyphWiki 里进一步编辑,保存 png 或者 svg 都可以。
我在 ubuntu 20.04 上编译没有问题。
执行 kpsewhich cmunrm.otf
看结果是什么,如果没有就是字体没装。
如果有,执行 sudo fc-cache -fsv
刷新字体缓存试试。
上知乎花 1 块钱付费咨询@李阿玲 https://www.zhihu.com/people/li-a-ling 。
ctex.pdf 第 8 页。
改成这样:
\setlist[trivlist]{nosep}
\newenvironment{zhengming}
{\setlength\partopsep{0pt}%
\begin{adjustwidth}{40pt}{40pt}
\begin{proof}
}
{
\end{proof}
\end{adjustwidth}
}
\newenvironment{dingli}
{\setlength\partopsep{0pt}%
\begin{adjustwidth}{40pt}{40pt}
\vspace{-\baselineskip}
\begin{theorem}
}
{
\end{theorem}
\end{adjustwidth}
}
坐标的表达式提前不会展开宏,而是一步步解析,并且在解析表达式时会使用 \pgfmathparse
,这会修改 \pgfmathresult
的值,所以 \pgfmathresult
的值是不确定的。
而数学表达式 \pgfmath
等,会首先展开它的参数,这时 \pgfmathresult
已经被展开了,它的值已经固定。
可以下载字体放到 /use/share/fonts
,然后更新 fontconfig 的配置文件。
如果只需要供 TeX Live 使用,可以直接下载到 $TEXMFROOT/texmf-local/fonts
文件夹,然后执行 (sudo) texhash && fc-cache -fsv
。
对于 Times New Roman
,TeXGyreTermes
和 TeXGyreTermesX
可以作为它的替代,字形几乎完全一致,并且已经在 TeX Live 里面了。
问题 1,如果不用 needspace
或类似的方法,会有极少的概率不能正确判断是否已经分页,比如下面的第四个标题就有可能会判断失败。
看看这是不是你想要的:
\documentclass{ctexart}
\usepackage{zhlipsum}
%\usepackage{showframe}
\ExplSyntaxOn\makeatletter
\cs_set_eq:NN \section:nn \section
\cs_new_protected:Npn \__my_needspace_if_newpage:nTF #1
{
% 可以试试删掉 \begingroup 和 \endgroup 之间的内容,看看能否正确判断第四个标题
\par \penalty-100\begingroup
\setlength{\dimen@}{\dimexpr#1}
\dimen@ii\pagegoal \advance\dimen@ii-\pagetotal
\ifdim \dimen@>\dimen@ii
\ifdim\dimen@ii>\z@ \vfil\fi
\penalty-\@M
\fi\endgroup
% 上面这些是 \Needspace 的代码,可以直接用 \Needspace{\dimexpr#1} 或 \Needspace*{\dimexpr#1} 替代
\bool_lazy_or:nnTF
{ \dim_compare_p:nNn { \pagegoal } = { \c_max_dim} }
{ \int_compare_p:nNn { \lastpenalty } < { -9999 } } % -\@M = -10000
}
\RenewDocumentCommand{ \section }{ m }
{
\__my_needspace_if_newpage:nTF { 1.5cm }
{ }
{ \hrule height0.4pt depth0pt }
\section:nn {#1}
}
\ExplSyntaxOff\makeatother
\begin{document}
\section{测试}
\zhlipsum[1-2]
\section{测试}
\zhlipsum[1]
\section{测试}
\zhlipsum[3-9][name=zhufu]
\section{测试}
\zhlipsum[1]
\end{document}
如果只需要 \captionof
,不需要强制 above
或 below
,caption
宏包就提供这个命令,必须用在一个环境内,不过最好是用 \captionsetup{type=...}
,这样可以正确处理超链接。
\begin{center}
\captionsetup{type=table...}
\caption{...}
...
\end{center}
如果需要强制设置 caption 的位置,而不管 \caption
是放在图片/文字前面还是后面,那 \captionaboveof
的功能不是这个(至少现在的版本不是)。如果需要类似的功能,floatrow
宏包可以全局设置 caption 的位置,也可用它的 floatrow
环境配合 \ffigbox
等。
封装一下 minipage
,设置 \parindent=0pt
。
\documentclass{article}
\ExplSyntaxOn
\box_new:N \l__skyrmion_left_box
\box_new:N \l__skyrmion_right_box
\box_new:N \l__skyrmion_seg_box
\keys_define:nn { skyrmion }
{
lefthand~ratio .fp_set:N = \l__skyrmion_left_ratio_fp ,
lefthand~width .dim_set:N = \l__skyrmion_left_dim ,
righthand~ratio .dim_set:N = \l__skyrmion_right_ratio_fp ,
righthand~width .dim_set:N = \l__skyrmion_right_dim ,
sidebyside~gap .dim_set:N = \l__skyrmion_gap_dim ,
sidebyside~gap .initial:n = 10mm ,
before~left .tl_set:N = \l__skyrmion_before_left_tl ,
before~right .tl_set:N = \l__skyrmion_before_right_tl ,
}
\cs_new_protected:Npn \twopartsplit
{
\dim_compare:nNnTF \l__skyrmion_right_dim < { 10sp }
{
%% Width is too small! Abort!
}
{
\__skyrmion_twopart_end_save:
\__skyrmion_twopart_save:NN \l__skyrmion_right_box \l__skyrmion_right_dim
\l__skyrmion_before_right_tl \ignorespaces
}
}
\NewDocumentEnvironment{twopart}{ O{} }
{
\par \keys_set:nn { skyrmion } {#1}
\__skyrmion_calc_width:
\__skyrmion_twopart_save:NN \l__skyrmion_left_box \l__skyrmion_left_dim
\l__skyrmion_before_left_tl \ignorespaces
}
{
\__skyrmion_twopart_end_save:
\__skyrmion_twopart_typeset:
}
\cs_new:Npn \__skyrmion_calc_width:
{
\bool_lazy_and:nnTF
{ \dim_compare_p:nNn \l__skyrmion_left_dim = \c_zero_dim }
{ \dim_compare_p:nNn \l__skyrmion_right_dim = \c_zero_dim }
{
\bool_lazy_and:nnTF
{ \fp_compare_p:nNn { abs ( \l__skyrmion_left_ratio_fp ) } < { 0.0001 } }
{ \fp_compare_p:nNn { abs ( \l__skyrmion_right_ratio_fp ) } < { 0.0001 } }
{
\dim_set:Nn \l__skyrmion_left_dim { 0.5\linewidth - 0.5\l__skyrmion_gap_dim }
\dim_set:Nn \l__skyrmion_right_dim { \l__skyrmion_left_dim }
}
{
\fp_compare:nNnTF { abs ( \l__skyrmion_left_ratio_fp ) } < { 0.0001 }
{
\dim_set:Nn \l__skyrmion_right_dim
{
\fp_use:N \l__skyrmion_right_ratio_fp
\dimexpr \linewidth - \l__skyrmion_gap_dim \relax
}
\dim_set:Nn \l__skyrmion_left_dim
{ \linewidth - \l__skyrmion_gap_dim - \l__skyrmion_right_dim }
}
{
\dim_set:Nn \l__skyrmion_left_dim
{
\fp_use:N \l__skyrmion_left_ratio_fp
\dimexpr \linewidth - \l__skyrmion_gap_dim \relax
}
\dim_set:Nn \l__skyrmion_right_dim
{ \linewidth - \l__skyrmion_gap_dim - \l__skyrmion_left_dim }
}
}
}
{
\dim_compare:nNnTF \l__skyrmion_left_dim = \c_zero_dim
{
\dim_set:Nn \l__skyrmion_left_dim
{ \linewidth - \l__skyrmion_gap_dim - \l__skyrmion_right_dim }
}
{
\dim_set:Nn \l__skyrmion_right_dim
{ \linewidth - \l__skyrmion_gap_dim - \l__skyrmion_left_dim }
}
}
}
\cs_new:Npn \__skyrmion_twopart_save:NN #1 #2
{
\hbox_set:Nw #1
\minipage {#2}
\setlength{\parindent}{0pt}
}
\cs_new:Npn \__skyrmion_twopart_end_save:
{
\endminipage
\hbox_set_end:
}
\cs_new:Npn \__skyrmion_seg: { } % 画线,可以用 tikz 等等
\cs_new:Npn \__skyrmion_twopart_typeset:
{
\hbox_to_wd:nn { \linewidth }
{
\hbox_set:Nn \l__skyrmion_seg_box { \__skyrmion_seg: }
\hbox_unpack_drop:N \l__skyrmion_left_box
\hss \clap { \box_use_drop:N \l__skyrmion_seg_box } \hss
\hbox_unpack_drop:N \l__skyrmion_right_box
}
}
\ExplSyntaxOff
\usepackage{lipsum,amsthm,tcolorbox}
\NewTColorBox { textfig } { O { .64\linewidth } }
{
sidebyside, sidebyside gap = .02\linewidth, boxsep = 0pt,
left = 0pt, right = 0pt, top = 3pt, bottom = 0pt,
lefthand width = #1, standard jigsaw, opacityback = 0, frame empty
}
\newtheorem{problem}{Problem}
\begin{document}
\begin{textfig}
\begin{problem}
\lipsum[2]
\end{problem}
\tcblower
\centering
\includegraphics[width = .5\linewidth]{example-image-a}
\end{textfig}
\begin{twopart}[sidebyside gap=.02\linewidth, lefthand width=.64\linewidth]
\begin{problem}
\lipsum[2]
\end{problem}
\twopartsplit
\centering
\includegraphics[width = .5\linewidth]{example-image-a}
\end{twopart}
\end{document}
也可以用 coffin
,代码是相似的。
问 正文的长短会影响章节标题位置?如何精准控制章节标题位置?