我想用机器人正方形围绕一些文本的方框。我想表示一个大小为 1 的标记对象,在组合学中,这通常用类似 来表示\boxed{1}
。如果方框是正方形就更好了。有适合此操作的命令吗?
答案1
这是基于我的collectbox
包的解决方案。这使得它支持逐字文本和其他特殊文本。
它不会改变内容的基线,这正是您通常想要的。
\documentclass{article}
\usepackage{collectbox}
\makeatletter
\newcommand{\sqbox}{%
\collectbox{%
\@tempdima=\dimexpr\width-\totalheight\relax
\ifdim\@tempdima<\z@
\fbox{\hbox{\hspace{-.5\@tempdima}\BOXCONTENT\hspace{-.5\@tempdima}}}%
\else
\ht\collectedbox=\dimexpr\ht\collectedbox+.5\@tempdima\relax
\dp\collectedbox=\dimexpr\dp\collectedbox+.5\@tempdima\relax
\fbox{\BOXCONTENT}%
\fi
}%
}
\makeatother
\usepackage{graphicx}% just for the example text
\begin{document}
.. \sqbox{Text} .. \sqbox{Very very long Text} .. \sqbox{\scalebox{.1}[10]{Stretched}} .. \sqbox{$\sum\limits_{k=0}^{10} x_k = i$} .. \sqbox{\verb+$%^&+}
\end{document}
或者,你可以不进行包装,而是直接将内容装箱:
\documentclass{article}
\makeatletter
\newcommand{\sqbox}[1]{%
\@begin@tempboxa\hbox{#1}%
\@tempdima=\dimexpr\width-\totalheight\relax
\ifdim\@tempdima<\z@
\fbox{\hbox{\hspace{-.5\@tempdima}\usebox\@tempboxa\hspace{-.5\@tempdima}}}%
\else
\ht\@tempboxa=\dimexpr\ht\@tempboxa+.5\@tempdima\relax
\dp\@tempboxa=\dimexpr\dp\@tempboxa+.5\@tempdima\relax
\fbox{\usebox\@tempboxa}%
\fi
\@end@tempboxa
}
\makeatother
\usepackage{graphicx}% For example only
\begin{document}
\noindent
.. \sqbox{Text} .. \sqbox{Very very long Text} .. \sqbox{\scalebox{.1}[10]{Stretched}} .. \sqbox{$\sum\limits_{k=0}^{10} x_k = i$} ..
\end{document}
答案2
这是强制性的过度tikz
版本。由于它利用了tikz
固有的所有灵活性,tikz
因此可以自定义正方形:
笔记:
- 如果文本很长则不起作用,除非将其放置在 中
\parbox
。
代码:
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{shapes}
\makeatletter
\newdimen\@myBoxHeight%
\newdimen\@myBoxDepth%
\newdimen\@myBoxWidth%
\newdimen\@myBoxSize%
\newcommand{\SquareBox}[2][]{%
\settoheight{\@myBoxHeight}{#2}% Record height of box
\settodepth{\@myBoxDepth}{#2}% Record depth of box
\settowidth{\@myBoxWidth}{#2}% Record width of box
\pgfmathsetlength{\@myBoxSize}{max(\@myBoxWidth,(\@myBoxHeight+\@myBoxDepth))}%
\tikz \node [shape=rectangle, shape aspect=1,draw=red,inner sep=2\pgflinewidth, minimum size=\@myBoxSize,#1] {#2};%
}%
\makeatother
\begin{document}
\SquareBox{I}
\SquareBox{y}
\SquareBox[thick, dashed]{long text}
\SquareBox[draw=blue]{longer text}
\SquareBox[draw=blue, thick, fill=yellow]{$e = mc^2$}
\SquareBox[draw=black, thick, fill=yellow!10, rounded corners=2pt]{$\displaystyle \int_{-\dfrac{\pi}{2}}^{\dfrac{\pi}{2}} dx $}
\end{document}
答案3
这应该对你有用。它会进行必要的垂直校正,以便文本位于基线上(与周围文本处于相同的垂直水平)。你可以更改线条\fboxsep
以获得或多或少紧密的框。
编辑:我删除了该\smash
命令,现在甚至连构造都无法$\left(\Sq{12345}^n\right)$
工作了。
编辑2:添加\textSq
文本模式内容并修改\Sq
以接受数学模式。
\documentclass{article}
\usepackage{calc}
\makeatletter
\def\textSq#1{%
\begingroup% make boxes and lengths local
\setlength{\fboxsep}{0.3ex}% SET ANY DESIRED PADDING HERE
\setbox1=\hbox{#1}% save the contents
\setlength{\@tempdima}{\maxof{\wd1}{\ht1+\dp1}}% size of the box
\setlength{\@tempdimb}{(\@tempdima-\ht1+\dp1)/2}% vertical raise
\raise-\@tempdimb\hbox{\fbox{\vbox to \@tempdima{%
\vfil\hbox to \@tempdima{\hfil\copy1\hfil}\vfil}}}%
\endgroup%
}
\def\Sq#1{\textSq{\ensuremath{#1}}}%
\makeatother
\begin{document}
Hello \textSq{1} world! $f(x):=\Sq1+\Sq2$.
\end{document}
答案4
这是一个使用pstricks
伟大的解决方案Herbert Voss 几年前提出:
\documentclass[12pt]{article}
\usepackage{pstricks}
\usepackage{auto-pst-pdf} % for easy pdf-output - otherwise comment this out
\def\bBox#1#2{\makebox[#1]{#2}}
\def\bhBox#1#2{\parbox[c][#1][c]{#1}{\makebox[#1]{#2}}}
\def\bhpBox#1#2{\parbox[c][#1][c]{#1}{\centering #2}}
\begin{document}
%\psset{framesep=0}
\psframebox{\bBox{1.3cm}{A}} und \psframebox{\bBox{1.3cm}{BBBBB}}
\psframebox{\bhBox{1.3cm}{A}} und \psframebox{\bhBox{1.3cm}{BBBBB}}
\psframebox{\bhpBox{1.3cm}{A}} und \psframebox{\bhpBox{1.3cm}{BBBBB}}
\end{document}