CTeX-org / forum

A temporarily alternate forum of `bbs.ctex.org`
https://t.me/chinesetex
Apache License 2.0
210 stars 16 forks source link

如何添加(或修改)中文标点禁则?例如禁止省略号出现在行首 #298

Open Li-ricecake opened 8 months ago

Li-ricecake commented 8 months ago

使用ctex宏包时发现中文省略号会出现在行首,这不符合中文标点禁则,顺带一提,ctex的控制单字成行并没有考虑到有的句子没有句末标点的问题

Liam0205 commented 8 months ago

听起来很奇怪,因为这种基本的禁则,早在 CTeX 1.x 时代就确认已经加上了。

如果您确认为是 CTeX 宏包导致,建议提供一个可以体现该问题的可编译的完整代码作为样例。

Li-ricecake commented 8 months ago

好的,这是可以复现此问题的完整可编译代码

\documentclass[fontset=windows,twoside]{ctexrep}
\begin{document}
唐代之前,荆楚民间存在一种祈求丰收的“牵钩之戏”,广为流传。《观拔河俗戏》诗有云:“壮徒恒贾勇,拔拒抵长河。欲练英雄志,须明胜负多……预期年岁稔,先此乐时和。”
\end{document}
zepinglee commented 8 months ago

好的,这是可以复现此问题的完整可编译代码

@Li-ricecake 最好给出编译方式和截图,方便说明。

zepinglee commented 8 months ago

使用 xelatex (xeCJK 2022/08/05 v3.9.1):

Screenshot 2023-11-08 at 15 51 02

使用 lualatex (luatexja 2023-10-10):

Screenshot 2023-11-08 at 15 52 11
muzimuzhi commented 8 months ago

texdoc xecjk (v3.9.1, 2022-08-05), sec. 3.1 宏包选项, p. 5

image

对应 xeCJK.dtx@8897869f 的 8309--8310 行, ^^^^2026 -> U+2026 ->

\keys_set:nn { xeCJK / options }
  {
    % ...
    LongPunct       = { ^^^^2014 ^^^^2e3a ^^^^2025 ^^^^2026 } ,
    MiddlePunct     = { ^^^^2013 ^^^^2014 ^^^^2e3a ^^^^2027 ^^^^00b7 ^^^^30fb ^^^^ff65 } ,
    % ...
  }
% !TeX program = xelatex
\documentclass[fontset=fandol, twoside]{ctexrep}

\def\demo{唐代之前,荆楚民间存在一种祈求丰收的“牵钩之戏”,广为流传。
  《观拔河俗戏》诗有云:“壮徒恒贾勇,拔拒抵长河。
  欲练英雄志,须明胜负多……预期年岁稔,先此乐时和。”}

\begin{document}
\demo

\xeCJKsetup{LongPunct-={…}, MiddlePunct+={…}}
\demo
\end{document}

image

zepinglee commented 8 months ago

要不要考虑将这设为默认?破折号和省略号属于《中文排版需求》行首行尾禁则 的“严格处理”级别。

Harry-Chen commented 8 months ago

要不要考虑将这设为默认?破折号和省略号属于《中文排版需求》行首行尾禁则 的“严格处理”级别。

这个“严格处理”应该是指最严格的规则,而不是需要最严格地执行?我的理解是 GB-style 默认比较好?

Li-ricecake commented 8 months ago

好的,这是可以复现此问题的完整可编译代码

@Li-ricecake 最好给出编译方式和截图,方便说明。 感谢提醒!我之后会注意的!

Li-ricecake commented 8 months ago

texdoc xecjk (v3.9.1, 2022-08-05), sec. 3.1 宏包选项, p. 5

image

对应 xeCJK.dtx@8897869f 的 8309--8310 行, ^^^^2026 -> U+2026 ->

\keys_set:nn { xeCJK / options }
  {
    % ...
    LongPunct       = { ^^^^2014 ^^^^2e3a ^^^^2025 ^^^^2026 } ,
    MiddlePunct     = { ^^^^2013 ^^^^2014 ^^^^2e3a ^^^^2027 ^^^^00b7 ^^^^30fb ^^^^ff65 } ,
    % ...
  }
% !TeX program = xelatex
\documentclass[fontset=fandol, twoside]{ctexrep}

\def\demo{唐代之前,荆楚民间存在一种祈求丰收的“牵钩之戏”,广为流传。
  《观拔河俗戏》诗有云:“壮徒恒贾勇,拔拒抵长河。
  欲练英雄志,须明胜负多……预期年岁稔,先此乐时和。”}

\begin{document}
\demo

\xeCJKsetup{LongPunct-={…}, MiddlePunct+={…}}
\demo
\end{document}

image

非常感谢您!提问之前我翻ctex的文档没找着相关内容,原来在xeCJK的文档里。。。

Li-ricecake commented 8 months ago

要不要考虑将这设为默认?破折号和省略号属于《中文排版需求》行首行尾禁则 的“严格处理”级别。

这个“严格处理”应该是指最严格的规则,而不是需要最严格地执行?我的理解是 GB-style 默认比较好?

至少是出版社编辑会给我揪出来叫我全改掉的问题,估计算是严肃情况下不能出现吧

Li-ricecake commented 8 months ago

texdoc xecjk (v3.9.1, 2022-08-05), sec. 3.1 宏包选项, p. 5

image

对应 xeCJK.dtx@8897869f 的 8309--8310 行, ^^^^2026 -> U+2026 ->

\keys_set:nn { xeCJK / options }
  {
    % ...
    LongPunct       = { ^^^^2014 ^^^^2e3a ^^^^2025 ^^^^2026 } ,
    MiddlePunct     = { ^^^^2013 ^^^^2014 ^^^^2e3a ^^^^2027 ^^^^00b7 ^^^^30fb ^^^^ff65 } ,
    % ...
  }
% !TeX program = xelatex
\documentclass[fontset=fandol, twoside]{ctexrep}

\def\demo{唐代之前,荆楚民间存在一种祈求丰收的“牵钩之戏”,广为流传。
  《观拔河俗戏》诗有云:“壮徒恒贾勇,拔拒抵长河。
  欲练英雄志,须明胜负多……预期年岁稔,先此乐时和。”}

\begin{document}
\demo

\xeCJKsetup{LongPunct-={…}, MiddlePunct+={…}}
\demo
\end{document}

image

这种做法有缺陷,省略号的两个“…”之间的间距可能会被拉大或挤小 用xeCJK提供的“设置相邻标点间距”可以解决 \xeCJKsetkern{…}{…}{0.2em}%将相邻两个…之间的间距设置为0.2em

muzimuzhi commented 8 months ago

@Li-ricecake 如无必要,建议不要全文引用某个长评论,只引用关键内容就行。让页面滚动条变短得慢一点……

非常感谢您!提问之前我翻ctex的文档没找着相关内容,原来在xeCJK的文档里。。。

用 xelatex 编译时,ctex 使用 xeCJK 中文方案。这也是为什么之前他们要问你提供更多信息、「给出编译方式」。

这种做法有缺陷,省略号的两个“…”之间的间距可能会被拉大或挤小 用xeCJK提供的“设置相邻标点间距”可以解决 \xeCJKsetkern{…}{…}{0.2em}%将相邻两个…之间的间距设置为0.2em

假设继续参考《中文排版需求》,破折号 U+2014 "—" 似乎也需要相似的设置。

[!NOTE] 中文排版需求,sec A.2 非夹注型标号

  • 破折号 占二个汉字大小,呈一直线、中间不断开。
  • 省略号 占二个汉字大小,呈一点线、中间不断开,应将省略点置于字面中央。

0.2em 会不会太大?我不了解 xeCJK 的标点符号处理,不知道这里「应该设成多大」,也不知道 \xeCJKsetwidth\xeCJKsetkern 的差异。

更新:等一下,xecjk/ctex 里的字宽(相邻两个汉字中心之间的距离)是可伸缩的。这就涉及中文排版需求里的「占二个汉字大小」怎么理解了

muzimuzhi commented 8 months ago

更新:等一下,xecjk/ctex 里的字宽(相邻两个汉字中心之间的距离)是可伸缩的。这就涉及中文排版需求里的「占二个汉字大小」怎么理解了

https://github.com/CTeX-org/ctex-kit/issues/382 里有一些讨论。