当我想将公式放入框中时,我希望框能够适应公式的长度。例如,我不想放入$1+1=2$
一个非常大的框。为了解决这个问题,我使用命令\encadrer
(它需要calc
包和ifthen
包),该命令包含在以下最小示例的序言中:
\documentclass[10pt,a4paper]{article}
\usepackage{ifthen}
\usepackage{calc}
%\encadrer:
\newlength\lenbox
\newcommand{\encadrer}[1]{
\linethickness{2pt}
\setlength\lenbox{\widthof{#1}}
\begin{center}
\fbox{
\begin{minipage}{\lenbox}
#1
\end{minipage}
}
\end{center}
}
\begin{document}
\encadrer{$1+1+1=3$}
\end{document}
但此命令不适用于多行。例如,如果我输入
\encadrer{$1+1+1=3$ \\ and \\ $1+1=2$}
在上例中,框变大了。在此示例中,我希望框的长度为 max( \widthof{$1+1+1=3$}
, \widthof{$1+1=2$}
)。我想到了一些东西:如果的参数的\encadrer
形式为:string1 \\ string2 \\ ... \\ stringN
,我可以使用xstring
包提取之间的所有字符串,\\
并使用循环来定义类似的东西:(伪代码)
set lenbox to 0
for i from 1 to N
set lenbox to max(lenbox,\widthof{stringi})
end for
但感觉很复杂,我想知道是否还有其他解决方案。如果我走在正确的轨道上,有人能帮我把这个伪代码转换成 LaTeX 代码吗?谢谢你的帮助!
答案1
这varwidth
包裹同名的varwidth
环境默认提供此功能,如果宽度小于指定的宽度,则设置一个“自然宽度”的框:
\documentclass[10pt,a4paper]{article}
\usepackage{varwidth}% http://ctan.org/pkg/varwidth
%\encadrer:
\newcommand{\encadrer}[1]{{%
\centering
\fbox{%
\begin{varwidth}{\dimexpr\linewidth-2\fboxsep-2\fboxrule}
\centering #1%
\end{varwidth}%
}
\par}%
}
\begin{document}
\encadrer{$1+1+1=3$}
\encadrer{$1+1+1=3$ \\ and \\ $1+1=2$}
\end{document}
答案2
您可以避免所有测量:
\documentclass[10pt,a4paper]{article}
\usepackage{varwidth}
%\encadrer:
\newcommand{\encadrer}[1]{%
\begin{center}
\setlength{\fboxrule}{2pt}
\fbox{%
\begin{varwidth}{\textwidth}
#1
\end{varwidth}%
}
\end{center}
}
\begin{document}
\encadrer{$1+1+1=3$}
\encadrer{$1+1+1=3$ \\ and \\ $1+1=2$}
\end{document}
请注意,框架厚度的参数是\fboxsep
;在center
环境中设置它可以确保它将恢复到以前的值。但是,正如您在图片中看到的那样,2pt 确实太多了。
还请注意,我保护了一些行尾以避免出现虚假空格。没有必要使用%
after\begin{varwidth}{\textwidth}
和 after,#1
因为在这些位置空格将被忽略,但\fbox
通常不会出现。
答案3
除了多行条目的问题之外,您的命令还因行尾\encadrer
缺失而包含大量额外的空白。%
我想你想要
\newcommand{\encadrer}[1]{\fbox{$\begin{array}{@{}c@{}}#1\end{array}$}}