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

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

Closed
chianjin opened this issue Jul 26, 2022 · 11 comments
Closed

Comments

@chianjin
Copy link

chianjin commented Jul 26, 2022

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

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

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

@chianjin chianjin changed the title jiazhu 包应用的两个问题 jiazhu 包跨页位置偏移和夹注后正文不能自动对齐的问题 Jul 26, 2022
@qinglee
Copy link
Member

qinglee commented Jul 27, 2022

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

@qinglee
Copy link
Member

qinglee commented Jul 27, 2022

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

@chianjin
Copy link
Author

chianjin commented Jul 27, 2022

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

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

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

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

@qinglee
Copy link
Member

qinglee commented Jul 27, 2022

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

@chianjin
Copy link
Author

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

@qinglee
Copy link
Member

qinglee commented Jul 27, 2022

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

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

@chianjin
Copy link
Author

感谢耐心解释。

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

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

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

@qinglee
Copy link
Member

qinglee commented Jul 27, 2022

关于问题 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
Copy link
Author

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

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

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

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

@qinglee
Copy link
Member

qinglee commented Jul 27, 2022

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

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

@qinglee qinglee closed this as completed Jul 29, 2022
@qinglee qinglee reopened this Jul 29, 2022
@qinglee
Copy link
Member

qinglee commented Aug 8, 2022

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

@qinglee qinglee closed this as completed Aug 8, 2022
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

2 participants