CTeX-org / ctex-kit

Macro Packages and Scripts for Chinese TeX users
982 stars 124 forks source link

ctex: part 带 hang 选项时在 ctexbook/ctexrep 下报错 #479

Closed stone-zeng closed 4 years ago

stone-zeng commented 4 years ago
\documentclass[fontset=fandol]{ctexbook}
\begin{document}
\ctexset{
  % part/aftername = \quad,
  part/hang = true
}
\part{标题标题标题标题标题标题}
\end{document}

报错为:

! Missing } inserted.
<inserted text> 
                }
l.7 \part{标题标题标题标题标题标题}

? 

加上 aftername = \quad,即令 name 和 title 处于同一行后,就不再出现问题。ctexartscheme=chinese 时默认就是 \quad,所以不报错。

muzimuzhi commented 4 years ago

在当前实现中,输入

\ctexset{
  part/hang = true
}
\part{标题标题标题标题标题标题}

内部会执行

\@hangfrom{ \CTEX@partname\CTEX@part@aftername }

% latex.ltx, line 6214:
\def\@hangfrom#1{\setbox\@tempboxa\hbox{{#1}}%
      \hangindent \wd\@tempboxa\noindent\box\@tempboxa}

这里 \@hangfrom#1 存入 hbox,所以在 #1 包含换行时报错。

在功能上,hang=trueaftername=\par 存在冲突,需要重新考虑这两个选项的关系。例如,考虑在设置 hang=true 时,总是把 aftername 初始化为一段 hskip?


相关源码 https://github.com/CTeX-org/ctex-kit/blob/dacf77095131f169f361437bf4e22dab830a3e7d/ctex/ctex.dtx#L7401-L7435 https://github.com/CTeX-org/ctex-kit/blob/dacf77095131f169f361437bf4e22dab830a3e7d/ctex/ctex.dtx#L7809-L7820

qinglee commented 4 years ago

正常情况下 \par\hbox 里并不报错,也合法,就是没有分段效果。这里报错的原因是 part 初始定义的的 aftername 里有一个 \vskip\vskip 确实是不能在水平盒子中。

关于这个选项冲突,代码实现层面没有什么好的解决办法,可在文档中说明。

Liam0205 commented 4 years ago

@qinglee 您这个…… image

qinglee commented 4 years ago

@Liam0205 XD