CTeX-org / ctex-kit

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

jiazhu 包跨页位置偏移和夹注后正文不能自动对齐的问题 #631

Closed chianjin closed 2 years ago

chianjin commented 2 years ago

夹注包在我的线装书直排应用中显示效果相当好。不过有两个小问题:

  1. 在多行夹注跨页时,如果首行没有正文的话,夹注位置有偏移。我的解决办法是手动断开,在两个夹注当中插入一个零宽度的影子汉字\vphantom{家}即可纠正,只要不是特别的字符,随便什么汉字都可以:\jiazhu{...}\vphantom{家}\jiazhu{...}。是否可以在夹注跨页时自动加入。 位置偏移位置纠正

  2. 线装书要求正文严格对齐,因此夹注字体尺寸应当是正文的一半,这样四个夹注汉字对应一个正文汉字。当夹注字数除以四之后剩余一个或两个字符时,正文错开半个字符。我的解决办法是在夹注末尾添加两个全角空格,使得夹注字符数正好是四的整数倍或者余三个字符,就能对齐正文。是否可以增加一个选项选择是否对齐正文。 正文未对齐正文对齐

qinglee commented 2 years ago
  1. 你可以尝试将 \topskip 的值调大一点,这个值是控制页面首行的基线位置的,LaTeX 的标准文档类根据选项的不同,默认值分别是 10pt/11pt/12pt,可能比正文和夹注的首行高度都小,所以首行基线的位置就不统一。如果调大 \topskip,相关的页面参数和你画的框线也要做适当的偏移调整,才能与原来的效果一致。除此之外,我想不到其他更合适的办法。
  2. 技术实现不复杂,但我没有相关方面的经验,想不到怎么处理合适,期待后来人吧。
qinglee commented 2 years ago

关于问题 2,在需要对齐的夹注设置 afterskip=1em,不知道能不能符合要求。

chianjin commented 2 years ago

感谢指导。尝试结果如下:

  1. 设置\topskip是可以调整跨页夹注首行的位置。似乎小于某个值的时候,才会对首行位置有影响;而超过另一个值的时候,其他页面正文首行也会移动。例如,正文20pt,基线间距30pt,似乎要大于14pt才有肉眼可见的调整,大约在16.5pt左右差不多能调整到位,当超过17.5pt时其他页面页发生偏移。这些数据未仔细测量,手工调整,肉眼观察得到的,不一定准确。而手工调整到准确位置太难了。

  2. afterskip参数不是我所提出的问题。我提出的问题,换句话是要求双行夹注的前一行字数必须是偶数,且前一行字数大于等于第二行字数。

这两个问题,我暂时有手动解决办法,就是我提问的时候说的方法,虽然略有麻烦,输出效果能满足要求。而且未来若 jiazhu 包代码中能直接解决,我觉得应该也不需要修改现在排版中代码。

qinglee commented 2 years ago

\topskip 在大于首行的高度时才有意义,我不知道你正文的字体大小是多少,就是直接将 \topskip 设置成正文的 \baselineskip 也未尝不可,可以保证首行的基线在同一个位置之上。

chianjin commented 2 years ago

正文字体大小是20pt,\baselineskip是30pt,根据我前面尝试的情况,\topskip不能设置为\baselineskip

qinglee commented 2 years ago

如果首行的高度大于 \topskip 的值,那么首行的基线到页面顶部的距离就等于首行的高度。汉字虽然是方块字,但是每个汉字的高度还是参差不齐的,没有办法保证每一行的高度都相等,也就没有办法保证页面首行基线的位置是一样的。何况你这里用了夹注,夹注的高度与正文的高度也不一致,就表现得更加明显。

如果首行的高度小于 \topskip 的值,TeX 会在首行之前加入一个高度为 \topskip 与首行高度之差的间距,保证首行的基线距离与页面顶部的距离等于 \topskip。这也就是我们调大 \topskip 的原因。调大之后,页面都会发生偏移,可以设置页面顶部的一些参数加以补偿。比较方便的是通过 geometry 包来设置,将选项 tmargin 的值相应调小一点。

chianjin commented 2 years ago

感谢耐心解释。

不过我暂时还是用我自己丑陋的解决方式。即使我现在能调整好位置,一旦改变字体大小和行间距之后,又要重新调整一遍,很麻烦了。

目前我自己的方法虽然丑陋,但能适应字体大小和行距的变化,效果也是满意的。

期待大神们不断更新完善。

qinglee commented 2 years ago

关于问题 2,你再试试在导言区加入下面的修改代码,就是保证夹注的行宽总是汉字宽度的偶数倍。

\ExplSyntaxOn
\cs_set_protected:Npn \__jiazhu_dim_normalize:N #1
  {
    \int_set:Nn \l_tmpa_int
      { \dim_ratio:nn {#1} { \l__jiazhu_unit_dim } }
    \int_if_even:nF { \l_tmpa_int }
      { \int_incr:N \l_tmpa_int }
    \dim_set:Nn #1 { \l__jiazhu_unit_dim * \l_tmpa_int }
  }
\cs_set_protected:Npn \__jiazhu_extract_max_width:N #1
  {
    \dim_set:Nn \l__jiazhu_width_dim { \box_wd:N #1 }
    \dim_set_eq:NN \l__jiazhu_max_dim \l__jiazhu_width_dim
  }
\ExplSyntaxOff
chianjin commented 2 years ago

十分感谢,问题 2 已经解决。

问题 1,据我的观察仅发生夹注跨页且无正文的首行。我是这么推测的:

  1. 夹注位置是根据正文基线位置而确定的,只要这一行有正文,无论出现在什么位置,包括跨页首行,夹注都能找到正确的位置。
  2. 如果是整行夹注,没有正文的话,有两种情况:如果不是首行,就根据前行位置定位;如果是首行,因为没有正文,那就只能就依照页面相关参数确定位置,于是出现了位置偏移的问题。

所以我就想是否可以“手动断开分成两个夹注,中间插入一个零宽度的影子汉字”即 \jiazhu{...}\vphantom{家}\jiazhu{...} 实践证明,我的方法是有效的,上面的推测也许是成立的。

qinglee commented 2 years ago

你的推测是正确的,夹注和之前的正文虽然看起来是在同一行之上,但其实他们根本就不是在同一段之中。在内部技术处理中,大概示意为

夹注前正文
$$
这里的数学环境是为了取得上一行的剩余宽度
$$
<一些间距处理>夹注
qinglee commented 2 years ago

已经完全解决,见 https://github.com/chianjin/zhvt-classic