I am looking for a command like \makebox{text to set width}[c]{new text} which would make a box with the width of text to set width containing ____new text____ centered.
5 Answers
Something like this?
\documentclass{article} \newlength\stextwidth \newcommand\makesamewidth[3][c]{% \settowidth{\stextwidth}{#2}% \makebox[\stextwidth][#1]{#3}% } \begin{document} \fbox{\makesamewidth[c]{text to set width}{new text}} \end{document} If the order of arguments is important you can use xparse:
\documentclass{article} \usepackage{xparse} \newlength\stextwidth \NewDocumentCommand\makesamewidth{ m O{c} m }{% \settowidth{\stextwidth}{#1}% \makebox[\stextwidth][#2]{#3}% } \begin{document} \fbox{\makesamewidth{text to set width}[c]{new text}} \end{document} using \NewDocumentCommand rather than \newcommand.
calc provides \widthof{<stuff>}:
\documentclass{article} \usepackage{calc} \setlength{\parindent}{0pt}% Just for this example \begin{document} Here is some text that is lengthy.\par \makebox[\widthof{Here is some text that is lengthy}][l]{Left}\par \makebox[\widthof{Here is some text that is lengthy}][c]{Centre}\par \makebox[\widthof{Here is some text that is lengthy}][r]{Right}\par \makebox[\widthof{Here is some text that is lengthy}][s]{S p a c e d} \end{document} And another awkward way of achieving your goal using a tabular:
\documentclass{article} \setlength{\parindent}{0pt}% Just for this example \makeatletter \newcommand{\widthbox}[1]{\gdef\stext{#1}\widthbox@} \newcommand{\widthbox@}[2][c]{% \begin{tabular}{@{}#1@{}} \phantom{\stext} \\[-\normalbaselineskip] #2 \end{tabular}} \begin{document} Here is some text that is lengthy.\par \widthbox{Here is some text that is lengthy}[l]{Left}\par \widthbox{Here is some text that is lengthy}[c]{Centre}\par \widthbox{Here is some text that is lengthy}[r]{Right} \end{document} Define a new length \mylen and then set it to the width of text.
\documentclass{article} \newlength{\mylen} \settowidth{\mylen}{text to set width} \begin{document} text to set width \makebox[\mylen][c]{new text} \end{document} One way using directly \wd:
\documentclass{article} \newcommand\mybox[3][c]{\setbox0\hbox{#2}\fbox{\makebox[\the\wd0][#1]{#3}}} \begin{document} \obeylines \mybox[c]{text to set width}{new text} \mybox[l]{text to set width}{new text} \mybox[r]{text to set width}{new text} \mybox[s]{text to set width}{new text} \mybox{text to set width}{new text} \end{document} 
- Note: obviously, one should remove the
\fbox{and an extra}to get rid of the frame (and its inner sep).ebosi– ebosi2017-09-20 14:49:47 +00:00Commented Sep 20, 2017 at 14:49
The simplest is perhaps to use the eqparbox package: it defines \eqparbox, eqmakebox, \eqframebox, \eqsavebox commands that have the same arguments as their basic LaTeX counterparts, except the width argument is replaced with a tag. All boxes with the same tag have the same width as the widest of them. In addition there is an \eqboxwidth{tag} length which may be used as a length argument.
For simple needs, the small makebox package defines a \makebox*{longer reference text}{shorter text} command.
\documentclass[12pt]{article} \usepackage[utf8]{inputenc} \usepackage{lipsum} \usepackage{makebox} \usepackage{eqparbox} \setlength\fboxsep{12pt} \begin{document} \begin{tabular}{c} \fbox{\makebox*{Blahblahblah, blahblahblah, blahblahblah…}{Blahblahblahblah}}\\\\ \fbox{\eqparbox{boxa}{Blahblahblah, blahblahblah, blahblahblah…}}\\\\ \eqframebox[boxa]{Blahblahblahblah}\\\\ \eqframebox[boxa]{Blahblahblah, blahblahblah, blahblahblah…}\\\\ \fbox{\parbox{\eqboxwidth{boxa}}{\lipsum[2]}} \end{tabular} \end{document} 



