Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
stone-zeng opened this issue Jan 7, 2020 · 4 comments
Closed

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

stone-zeng opened this issue Jan 7, 2020 · 4 comments

Comments

@stone-zeng
Copy link
Member

\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
Copy link
Contributor

在当前实现中,输入

\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?


相关源码

ctex-kit/ctex/ctex.dtx

Lines 7401 to 7435 in dacf770

%<*book|report>
\def\@part[#1]#2{%
\ifnum \c@secnumdepth >-2\relax
\ifodd \CTEX@part@numbering
\CTEX@ifnametrue
\refstepcounter{part}%
% \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
\else
\CTEX@ifnamefalse
\CTEX@makeanchor{part*}%
% \addcontentsline{toc}{part}{#1}%
\fi
\else
\CTEX@ifnamefalse
\CTEX@makeanchor{part*}%
% \addcontentsline{toc}{part}{#1}%
\fi
\CTEX@gettitle{#1}%
\CTEX@addtocline{part}{#1}%
% \markboth{}{}%
\partmark{#1}%
{\interlinepenalty \@M
% \normalfont \centering
\CTEX@disableautoindent
\normalfont \CTEX@part@format
% \ifnum \c@secnumdepth >-2\relax
% \huge\bfseries\partname\nobreakspace\thepart\par\vskip 20\p@
% \fi
\CTEX@hangindent{part}%
{\CTEXifname{\CTEX@partname\CTEX@part@aftername}{}}%
% \Huge\bfseries #2\par}%
\CTEX@part@titleformat{#2}%
\CTEX@part@aftertitle}%
\@endpart}
%</book|report>

ctex-kit/ctex/ctex.dtx

Lines 7809 to 7820 in dacf770

\cs_new_protected:Npn \CTEX@hangindent #1#2
{
\dim_set:Nn \parindent { \use:c { CTEX@#1@indent } }
\bool_if:cTF { CTEX@#1@hang }
{ \@hangfrom { \@@_indent_aux: #2 } }
{#2}
}
\cs_new_protected_nopar:Npn \@@_indent_aux:
{
\dim_compare:nNnF \parindent = \c_zero_dim
{ \skip_horizontal:n { \parindent } }
}

@stone-zeng stone-zeng mentioned this issue Jan 10, 2020
25 tasks
@qinglee
Copy link
Member

qinglee commented Apr 26, 2020

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

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

@Liam0205
Copy link
Contributor

@qinglee 您这个……
image

@qinglee
Copy link
Member

qinglee commented Apr 26, 2020

@Liam0205 XD

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants