制作具有最小宽度的框(在数学模式下)

制作具有最小宽度的框(在数学模式下)

在数学模式下,如何为框指定最小宽度?也就是说,我想要一个类似 的命令\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}

在此处输入图片描述

相关内容