装订线虚线方向修正:横杠改回竖杠 #20

用户反馈:「这个装订线不行,得改,需要跟之前的模板保持一致。」

## 问题:整条装订线成了「梯子」

#20 把连字符虚线改成几何线画时,方向画反了。逐像素对比基线与修改后:

  基线(18bp 连字符 rotate 90°):x 51.10~52.10(宽 1.10)、y 跨 4.30
  改后(我画的水平线)    :x 49.40~53.70(宽 4.30)、y 跨 1.00

即基线的每一笔是**竖着的短杠**,我画成了**横着的短杠**。一排横杠叠在
竖线位置上,视觉上就是一把梯子,与原卷完全不同。

## 根因:量数据时没分辨长宽各自对应哪个轴

上一轮 720dpi 扫描得到「长 4.40bp、粗 1.10bp、x 中心 51.60bp」,
三个数都对,但**装配时把「长」放到了 x 轴、「粗」放到了线宽**。
连字符经 rotate=90 后,字面长度落到**纵轴**、线粗落到**横轴**:

  竖:y 跨 4.30bp(连字符的字面长度)
  横:x 跨 1.10bp(连字符的笔画粗细)
  中心 x = 51.60bp

## 修法

  - \draw[line width=1.10bp] (49.40, -y) -- (53.70, -y);     ← 水平线(错)
  + \draw[line width=1.10bp] (51.60, -y) -- (51.60, -y-4.30); ← 竖直线(对)

x 恒定在 51.60,y 跨 4.30bp。单笔画长度用 4.30(720dpi 实测的墨迹边界),
不是之前写的 4.40(那是含抗锯齿溢出的粗估值)。

## 验证:与基线逐像素同值

装订线区域(x 48~56, y 55~690)在 300dpi 下的墨迹像素数:

  基线  7553 像素(8.40%)
  新版  7553 像素(8.40%)  ← 完全相同

逐段比对(720dpi 逐行扫描,过滤掉「装订线」三个汉字的干扰):

  段  笔数   顶端 y    末笔底 y   单笔长   笔距
   1   24    62.20     204.90     4.30    6.00
   2   24   216.50     358.60     4.30    6.00
   3    3   364.80     379.50     4.30    6.00
   4   13   393.40     469.60     4.30    6.00
   5   16   475.80     568.30     4.30    6.00
   6   16   582.10     676.30     4.30    6.00

新版逐段同值,单笔长 4.20 vs 4.30 的 0.1bp 差异是抗锯齿边缘取整。
x 位置 51.00~52.00 vs 51.10~52.10 同样差 0.1bp(亚像素取整),肉眼不可见。

## 编译验证

  Windows / TeX Live 2022   试卷 rc=0 err=0 over=0 6页
                            答案卷 rc=0 err=0 over=0 3页
  WSL / TeX Live 2025       试卷 rc=0 err=0 over=0 6页
                            答案卷 rc=0 err=0 over=0 3页

答案卷不走装订线(\oucexam 的 shipout 钩子只属于试卷),未受影响。

涉及文件:试卷/oucexam.sty(仅 \ouc@dashseg 一个宏 + 注释)
This commit is contained in:
2026-10-29 21:35:57 +08:00
parent 93b03c8a78
commit fb7c76b944
+20 -8
View File
@@ -392,17 +392,28 @@
\fi} \fi}
%---------------------------------------------------------------------- %----------------------------------------------------------------------
% 装订线虚线段:一个连字符笔画 = 一条 4.40bp 长、1.10bp 粗的横线 % 装订线虚线段:一个连字符笔画 = 一条**竖直**短线段
% %
% 参数:#1 = 这一串最上一笔的 y 坐标(bp,从页面顶端往下量) % 参数:#1 = 这一串最上一笔的顶端 y 坐标(bp,从页面顶端往下量)
% #2 = 笔画个数 % #2 = 笔画个数
% 相邻笔画间隔 6.00bp,与原卷 18bp 连字符的步距一致。 % 相邻笔画顶端间隔 6.00bp,与原卷 18bp 连字符的步距一致。
%
% ⚠️⚠️ 方向别搞反(#20 返工过一次,记清楚):
% 原卷的连字符是 rotate=90 排的,所以连字符的**横向长度转到了纵轴**、
% **线粗转到了横轴**。也就是说每一笔是「竖着的短杠」,不是「横着的短杠」:
% 竖:y 跨 4.30bp(这是连字符的字面长度)
% 横:x 跨 1.10bp(这是连字符的笔画粗细)
% 中心 x = 51.60bp
% 第一版按"水平线"画((49.40,y)--(53.70,y)),结果整条装订线变成
% 一把**梯子**(一排横杠叠在竖线位置),与基线观感完全不同。
% 用户反馈「这个装订线不行,需要跟之前的模板保持一致」即指此。
%
% ⚠️ x 中心 51.60bp 是原卷实测:连字符字符盒 x 41.60~59.60(18bp 宽),
% 但可见笔画只在 51.10~52.10,即字形在字符盒内偏右、
% 中心 51.60 —— 这是 Times 连字符的字形位置,不是笔误。
% %
% ⚠️ 必须定义在 \ouc@dobindstrip **外面**。放进去的话每次 shipout 都会 % ⚠️ 必须定义在 \ouc@dobindstrip **外面**。放进去的话每次 shipout 都会
% 重新 \newcommand 一次,第二页起报 "command already defined"。 % 重新 \newcommand 一次,第二页起报 "command already defined"。
% ⚠️ x 坐标:笔画左端 49.40bp、右端 53.80bp(宽 4.40bp),
% 中心 51.60bp —— 这是原卷实测值,不是从 \tnr 连字符推的,
% 所以换任何字体都不会动。
% ⚠️ y 坐标**不能**写成 \dimexpr#1bp+\i*6bp:TikZ 的坐标解析器不认 % ⚠️ y 坐标**不能**写成 \dimexpr#1bp+\i*6bp:TikZ 的坐标解析器不认
% 带小数点的小数 + \dimexpr 组合,会报 % 带小数点的小数 + \dimexpr 组合,会报
% Illegal unit of measure (pt inserted) % Illegal unit of measure (pt inserted)
@@ -412,9 +423,10 @@
\newcommand{\ouc@dashseg}[2]{% \newcommand{\ouc@dashseg}[2]{%
\foreach \i in {0,...,\the\numexpr#2-1\relax}{% \foreach \i in {0,...,\the\numexpr#2-1\relax}{%
\pgfmathsetmacro{\ouc@dyy}{#1+\i*6.00}% \pgfmathsetmacro{\ouc@dyy}{#1+\i*6.00}%
\pgfmathsetmacro{\ouc@dzz}{\ouc@dyy+4.30}%
\draw[line width=1.10bp,line cap=butt] \draw[line width=1.10bp,line cap=butt]
([xshift=49.40bp,yshift=-\ouc@dyy bp]B) -- ([xshift=51.60bp,yshift=-\ouc@dyy bp]B) --
([xshift=53.80bp,yshift=-\ouc@dyy bp]B);}} ([xshift=51.60bp,yshift=-\ouc@dzz bp]B);}}
\newcommand{\ouc@dobindstrip}{% \newcommand{\ouc@dobindstrip}{%
\begin{tikzpicture}[remember picture,overlay] \begin{tikzpicture}[remember picture,overlay]