在数学模式下,如何为框指定最小宽度?也就是说,我想要一个类似 的命令\minwidth{exp}{width}
,它将始终排版exp
,但此外,如果的自然长度exp
小于width
,将通过将其置于宽度为的框的中心来填充width
。
例如,$A \minwidth{i}{2em} B$
应该像 一样出来$A \makebox[2em][c]{i} B$
;但$A \minwidth{WXYZ}{2em} B$
应该像 一样出来$A WXYZ B$
。
该varwidth
包提供了这种可变宽度的功能,但仅适用于小页面,而不适用于普通框或类似内容。
(该用例是针对内联 TikZ 箭头命令的变体,定义在这个答案,将箭头标签填充到最小宽度,以便箭头可以延伸到较大的标签,但当标签较短或不存在时不会变得太短。)
编辑:这结果有点XY问题:Harish Kumar 出色地回答了我的实际问题,但没有回答这个具体问题。我现在使用的是改编自他的回答的内容:
\newcommand{\myto}[1][]{ \mathrel{
\tikz[baseline={([yshift=-0.55ex]a.south)}]{%
\node[minimum width=1.5em,align=center,inner xsep=0.3ex,inner ysep=0.15ex] (a) {$\scriptstyle #1$};
\draw[->] (a.south west) -- ([xshift=0.6ex]a.south east);}
}\mkern-1mu}
用法与 相同$A \myto[f] B$
。
不过,我仍然对所提具体问题的答案感兴趣。
答案1
这是tikz
唯一的方法。ex
适当调整。
\documentclass{article}
\usepackage{tikz,mathtools}
\usetikzlibrary{arrows}
\newcommand*{\ident}[1]{\texttt{\small #1}}
\tikzstyle{refines} = [->, >=open triangle 45]
\newcommand{\refi}[3]{%
\( #1 \)
\tikz[baseline={([yshift=-0.5ex]a.south)}]{%
\node[minimum width=2em,align=center] (a) {$#2$}; %%<<---- width here
\draw[refines] (a.south west) -- ([xshift=1ex]a.south east);} %% <<---- shift here
\(#3 \)}
\begin{document}
This is a test \refi{\ident{1}}{\text{t}}{\ident{2}}\ident{2} that continues here.
This is a test \refi{1}{\text{longer text}}{1} that continues here.
A further test \refi{j_2}{\alpha-x e^{p/q}}{a^2} with more text.
\end{document}
这里的魔法词是minimum width=2em
的选项node
。我还使用了一些xshift
箭头以使其更加对称。根据需要调整这些值。
答案2
\makebox
将其内容放入一个盒子中,该盒子的尺寸为\width
,,在可选参数中:\height
\depth
\makebox
\documentclass{article}
\newcommand*{\minwidthbox}[2]{%
\makebox[{\ifdim#2<\width\width\else#2\fi}]{#1}%
}
\begin{document}
\noindent
[\minwidthbox{i}{2em}]\\\relax
[\minwidthbox{WXYZ}{2em}]
\end{document}
具有自动数学模式和样式检测的扩展示例:
\documentclass{article}
\newcommand*{\minwidthbox}[2]{%
\relax
\ifmmode
\mathpalette{\minwidthboxmath{#1}{#2}}{}%
\else
\makebox[{\ifdim#2<\width\width\else#2\fi}]{#1}%
\fi
}
\newcommand*{\minwidthboxmath}[4]{%
% #1: box contents
% #2: minimum width
% #3: math style
% #4: unused
\mbox{\minwidthbox{$#3#1$}{#2}}%
}
\begin{document}
\noindent
[\minwidthbox{i}{2em}]\\\relax
[\minwidthbox{WXYZ}{2em}]
\noindent
$a\minwidthbox{i}{2em}b$\\
$a\minwidthbox{WXYZ}{2em}b$
\end{document}
答案3
进一步推动 Heiko 的想法,但让其mathtools
完成工作:
\documentclass{article}
\usepackage{mathtools}
\DeclareRobustCommand{\minwidthbox}[2]{%
\ifmmode
\expandafter\mathmakebox
\else
\expandafter\makebox
\fi
[\ifdim#2<\width\width\else#2\fi]{#1}%
}
\begin{document}
\noindent
[\minwidthbox{i}{2em}]\\\relax
[\minwidthbox{WXYZ}{2em}]
\noindent
$a\minwidthbox{i}{2em}b$\\
$a\minwidthbox{WXYZ}{2em}b$
\noindent
$A\xrightarrow{i}B$\\
$A\xrightarrow{\minwidthbox{i}{3em}}B$% exaggerated
\end{document}