\hskip
我们经常发现自己在和中使用非零拉伸和收缩部分\mskip
,通常是自然空间值的 50%,例如\hskip.1em plus.05em minus.05em
或\mskip1mu plus.5mu minus.5mu
。我们如何自动计算一半?换句话说,我们需要类似的东西
\documentclass{standalone}
\newcommand{\mSkipWithHalfStretchAndHalfShrink}[1]{\mskip#1 plus.5#1 minus.5#1}% 50 per cent of the argument after plus and minus. The argument may be any integer or floating-point number.
\showoutput
\begin{document}
\(a\mSkipWithHalfStretchAndHalfShrink{20mu}b\)% expected to expand to \(a\mskip20mu plus10mu minus10mu b\)
\end{document}
不幸的是,无论整数参数是什么,这都会产生大约 0.28–0.29 的拉伸和收缩部分。此外,在参数中使用小数点(例如 in \(a\mSkipWithHalfStretchAndHalfShrink{1.5mu}b\)
)会引发错误。我们还尝试了 \mskip#1 plus\ratio{#1}{2} minus\ratio{#1}{2}
使用 calc 包等方法,但都没有成功。
答案1
就像这样。带有\muexpr
。
\documentclass{standalone}
\newcommand{\mSkipWithHalfStretchAndHalfShrink}[1]{\mskip#1 plus .5\muexpr#1\relax minus.5\muexpr#1\relax\relax}% 50 per cent of the argument after plus and minus. The argument may be any integer or floating-point number.
\showoutput
\begin{document}
\(a\mSkipWithHalfStretchAndHalfShrink{20mu}b\)
\(a\mskip20mu plus10mu minus10mu b\)
\end{document}
从技术上讲,文档是在 中etex_man
,但是为了理解发生了什么,您需要非常了解 TeXbook 中的符号。
顺便说一句,建议添加\relax
以明确终止维度表达式。请参阅书中的练习 27.4(尽管在这种情况下似乎很安全,因为minus
已经是最后一个了)。这里我因为嵌套而添加了两个。
答案2
下面的代码展示了我们可以在 TeX 原始级别做什么:
\def\hskipflex{\afterassignment\hskipflexA\dimen0=}
\def\hskipflexA{\hskip\dimen0 plus.5\dimen0 minus.5\dimen0 \relax}
\def\mskipflex{\afterassignment\mskipflexA\muskip0=}
\def\mskipflexA{\mskip 1\muskip0 plus.5\muskip0 minus.5\muskip0 \relax}
$x\mskipflex 10mu y$ %% does \mskip 10mu plus5mu minus5mu
a\hskipflex 1em b %% does \hskip 1em plus.5em minus.5em
\bye
答案3
说实话,我从来没有使用过这样的规范,更不用说“经常”使用这样的规范了。
方法如下:
\NewDocumentCommand{\hspaceflex}{sm}{%
\IfBooleanTF{#1}{\hspace}{\hspace*}%
{#2 plus \dimeval{#2/2} minus \dimeval{#2/2}}%
}
% there's no user level interface to \muskip_eval:n (yet)
\ExplSyntaxOn
\cs_if_exist:NF \muskipeval { \cs_new_eq:NN \muskipeval \muskip_eval:n }
\ExplSyntaxOff
\NewDocumentCommand{\mspaceflex}{m}{%
\mspace{#1 plus \muskipeval{#1/2} minus \muskipeval{#1/2}}%
}
你称它们为
\hspaceflex{1em}
\hspaceflex*{1em}
\mspaceflex{4mu}
请注意,\mspace
需要amsmath
。