具有半拉伸和半收缩功能的 mskip 宏?

具有半拉伸和半收缩功能的 mskip 宏?

\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

相关内容