XeTeX 的水平括号占用太多空间

XeTeX 的水平括号占用太多空间

经过一些实验和测试,我设法在 Plain XeTeX 中为\upbracefill和创建了以下代码\downbracefill,看起来似乎是用于\underbrace和 的\overbrace

\def\midshift#1{
\setbox0=\hbox{#1}\dimen0=\ht0\advance\dimen0by+\dp0\advance\dimen0by-1ex
\lower.5\dimen0\box0 }

\def\rotatebrace#1{%
\leavevmode\setbox0=\hbox{#1}\rlap{%
\kern.5\wd0\dimen0=\ht0\advance\dimen0by-\dp0%\advance\dimen0by+1ex%
\raise.5\dimen0\hbox{\special{x:gsave}\special{x:rotate 90}}}%
\box0\special{x:grestore}}

[...]

\XeTeXmathchardef\bracelu = 0 3 `\⎧
\XeTeXmathchardef\bracemu = 0 3 `\⎨
\XeTeXmathchardef\braceru = 0 3 `\⎩
\XeTeXmathchardef\bracebar = 0 3 `\⎪
\XeTeXmathchardef\braceld = 0 3 `\⎫
\XeTeXmathchardef\bracemd = 0 3 `\⎬
\XeTeXmathchardef\bracerd = 0 3 `\⎭

\def\upbracefill{\rotatebrace{\midshift{$\bracelu$}}%
    \cleaders\hbox{\rotatebrace{\midshift{$\bracebar$}}}\hfill
    \rotatebrace{\midshift{$\bracemu$}}%
    \cleaders\hbox{\rotatebrace{\midshift{$\bracebar$}}}\hfill
    \rotatebrace{\midshift{$\braceru$}}}%
\def\downbracefill{\rotatebrace{\midshift{$\braceld$}}%
    \cleaders\hbox{\rotatebrace{\midshift{$\bracebar$}}}\hfill
    \rotatebrace{\midshift{$\bracemd$}}%
    \cleaders\hbox{\rotatebrace{\midshift{$\bracebar$}}}\hfill
    \rotatebrace{\midshift{$\bracerd$}}}%

Cambria Math 已为 3. 系列加载。
但是,由于支架的中间部分,这些支架的高度较大,我找不到缩小/限制盒子高度的方法,否则支架会散架。

我最初使用:vertical字体的参数,我认为水平文本没有尺寸。

那么我怎样才能使这个水平括号的高度更小呢?(最好是字符宽度,也就是现在的高度。)

答案1

在我看到 的\upbracefill用法后\underbrace,我觉得有必要纠正这个问题,所以我花了一些时间研究它,看看我有什么选择。很快我意识到唯一好的解决方案是,如果我在 的帮助下缩小每个字符的边界框\setbox。(唯一的问题是在字符的正确状态下执行此操作。)由于最大的字符是中间的字符,我将它们的高度安排到那个位置。(其余字符的高度与该高度对齐,但是 0pt 高度也可以。)
所以这里是使用上述\rotatebrace\midshift宏的结果:

\def\upbracefill{%
    \setbox0=\hbox{\lower.64ex\hbox{\rotatebrace{\midshift{$\bracemu$}}}}\ht0=.1\wd0\dp0=0pt%
    \setbox1=\hbox{\lower.64ex\hbox{\rotatebrace{\midshift{$\bracelu$}}\kern-.2em}}\ht1=.1\wd0\dp1=0pt%
    \setbox2=\hbox{\lower.64ex\hbox{\rotatebrace{\midshift{$\bracebar$}}}}\ht2=.1\wd0\dp2=0pt%
    \setbox3=\hbox{\lower.64ex\hbox{\kern-.2em\rotatebrace{\midshift{$\braceru$}}}}\ht3=.1\wd0\dp3=0pt%
    \box1\cleaders\copy2\hfill\box0\cleaders\box2\hfill\box3}

\def\downbracefill{%
    \setbox0=\hbox{\lower.64ex\hbox{\rotatebrace{\midshift{$\bracemd$}}}}\ht0=.1\wd0\dp0=0pt%
    \setbox1=\hbox{\lower.64ex\hbox{\rotatebrace{\midshift{$\braceld$}}\kern-.2em}}\ht1=.1\wd0\dp1=0pt%
    \setbox2=\hbox{\lower.64ex\hbox{\rotatebrace{\midshift{$\bracebar$}}}}\ht2=.1\wd0\dp2=0pt%
    \setbox3=\hbox{\lower.64ex\hbox{\kern-.2em\rotatebrace{\midshift{$\bracerd$}}}}\ht3=.1\wd0\dp3=0pt%
    \box1\cleaders\copy2\hfill\box0\cleaders\box2\hfill\box3}%

这是一个例子:外语文本中的水平括号示例 上面的例子使用 Calibri 来表示普通文本,使用 Cambria 来表示数学方程式(就像 Office 2007 一样),以及使用括号,就像我的一门课的匈牙利笔记一样。
笔记:在某些查看器中,在特定缩放比例下,它看起来好像要散架了,并且字符的连接似乎比应有的粗。这在打印时是可以的。

相关内容