![XeTeX 的水平括号占用太多空间](https://linux22.com/image/232358/XeTeX%20%E7%9A%84%E6%B0%B4%E5%B9%B3%E6%8B%AC%E5%8F%B7%E5%8D%A0%E7%94%A8%E5%A4%AA%E5%A4%9A%E7%A9%BA%E9%97%B4.png)
经过一些实验和测试,我设法在 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 一样),以及使用括号,就像我的一门课的匈牙利笔记一样。
笔记:在某些查看器中,在特定缩放比例下,它看起来好像要散架了,并且字符的连接似乎比应有的粗。这在打印时是可以的。