Como dimensionar uma linha de texto para uma largura exata

Como dimensionar uma linha de texto para uma largura exata

Gostaria de dimensionar algumas linhas de texto para que se alinhem perfeitamente à esquerda e à direita. Usando resizebox* eu tenho algo que quase funciona, mas há um pouquinho de espaço em branco nas bordas. Quanto maior o tamanho da fonte, maior será o espaço em branco.

\documentclass{article}
\usepackage{graphicx}
\setkeys{Gin}{keepaspectratio} % to maintain aspect ratio of content inside resizebox
\setlength{\fboxsep}{0cm} % So that we can see the exact box around some text


\begin{document}%
    \setlength{\parindent}{0cm}
    \fbox{\resizebox*{12cm}{2cm}{OOOOOOOOOOOOOOOOOOOOOO}}\\%
    \fbox{\resizebox*{12cm}{2cm}{OOOOOOOOOOOOOO}}\\%
    \fbox{\resizebox*{12cm}{2cm}{OOOOOO}}\\%
\end{document}

Ele produz uma saída como esta:

Linhas usando resizebox não se alinham perfeitamente

Responder1

Se você estiver disposto a usar o XeLaTeX, poderá fazê-lo sem adivinhar.

\documentclass{article}
\usepackage{fontspec}
\usepackage{graphicx}

\newcommand{\removeleft}[1]{%
  \leavevmode\kern-\XeTeXglyphbounds1 \the\XeTeXcharglyph`#1\relax
  #1%
}
\newcommand{\removeright}[1]{%
  #1%
  \kern-\XeTeXglyphbounds3 \the\XeTeXcharglyph`#1\relax
}

\setlength{\parindent}{0pt}
\setlength{\fboxsep}{0pt}

\begin{document}

\fbox{\resizebox{12cm}{!}{\removeleft{O}OOOOOOOOOOOOOOOOOOOO\removeright{O}}}

\fbox{\resizebox{12cm}{!}{\removeleft{O}OOOOOOOOOOOO\removeright{O}}}

\fbox{\resizebox{12cm}{!}{\removeleft{O}OOOO\removeright{O}}}

\end{document}

O truque é explicado na documentação do XeTeX. Primeiro obtemos o número do glifo do primeiro caractere e depois medimos sua orientação lateral esquerda. Da mesma forma para o último.

insira a descrição da imagem aqui

Com alguns expl3truques, podemos evitar a separação da primeira e da última letra:

\documentclass{article}
\usepackage{fontspec}
\usepackage{graphicx}

\newcommand{\remove}[2]{%
  \leavevmode\kern-\XeTeXglyphbounds#2\space\the\XeTeXcharglyph`#1\relax
}

\ExplSyntaxOn
\cs_set_eq:NN \tobyone_remove_sb:nn \remove
\cs_generate_variant:Nn \tobyone_remove_sb:nn { fn }

\NewDocumentCommand{\removesidebearings}{m}
 {
  \tobyone_remove_sb:fn { \tl_head:n { #1 } } { 1 }% left
  #1
  \tobyone_remove_sb:fn { \tl_head:f { \tl_reverse:n { #1 } } } { 3 }
 }
\ExplSyntaxOff

\setlength{\parindent}{0pt}
\setlength{\fboxsep}{0pt}

\begin{document}

\fbox{\resizebox{12cm}{!}{\removesidebearings{OOOOOOOOOOOOOOOOOOOOOO}}}

\fbox{\resizebox{12cm}{!}{\removesidebearings{OOOOOOOOOOOOOO}}}

\fbox{\resizebox{12cm}{!}{\removesidebearings{OOOOOO}}}

\end{document}

Se você também precisar dos caracteres especiais do TeX, adicione definições como segue e use os “nomes simbólicos”.

\documentclass{article}
\usepackage{fontspec}
\usepackage{graphicx}

\newcommand{\remove}[2]{%
  \leavevmode\kern-\XeTeXglyphbounds#2\space\the\XeTeXcharglyph`#1\relax
}

\ExplSyntaxOn
\cs_set_eq:NN \tobyone_remove_sb:nn \remove
\cs_generate_variant:Nn \tobyone_remove_sb:nn { fn }

\NewDocumentCommand{\removesidebearings}{m}
 {
  \tobyone_remove_sb:fn { \tl_head:n { #1 } } { 1 }% left
  #1
  \tobyone_remove_sb:fn { \tl_head:f { \tl_reverse:n { #1 } } } { 3 }
 }

\cs_set_eq:NN \ampersandchar  \c_ampersand_str
\cs_set_eq:NN \backslashchar  \c_backslash_str
\cs_set_eq:NN \leftbracechar  \c_left_brace_str
\cs_set_eq:NN \rightbracechar \c_right_brace_str
\cs_set_eq:NN \circumflexchar \c_circumflex_str
\cs_set_eq:NN \dollarchar     \c_dollar_str
\cs_set_eq:NN \hashchar       \c_hash_str
\cs_set_eq:NN \percentchar    \c_percent_str
\cs_set_eq:NN \tildechar      \c_tilde_str
\cs_set_eq:NN \underscorechar \c_underscore_str
\ExplSyntaxOff

\setlength{\parindent}{0pt}
\setlength{\fboxsep}{0pt}

\begin{document}

\fbox{\resizebox{12cm}{!}{\removesidebearings{\dollarchar abc\rightbracechar}}}

\fbox{\resizebox{12cm}{!}{\dollarchar abc\rightbracechar}}

\end{document}

insira a descrição da imagem aqui

Responder2

Isso funciona, mas é baseado em tentativa e erro (sem solução limpa):

\documentclass{article}
\usepackage{graphicx}
\setkeys{Gin}{keepaspectratio} % to maintain aspect ratio of content inside resizebox
\setlength{\fboxsep}{0cm} % So that we can see the exact box around some text

\newlength\mycor
\mycor=-0.555428pt

\begin{document}%
    \setlength{\parindent}{0cm}
    \fbox{\resizebox*{12cm}{2cm}{\hspace*{\mycor}OOOOOOOOOOOOOOOOOOOOOO}\hspace*{\mycor}}\\%
    \fbox{\resizebox*{12cm}{2cm}{\hspace*{\mycor}OOOOOOOOOOOOOO\hspace*{\mycor}}}\\%
    \fbox{\resizebox*{12cm}{2cm}{\hspace*{\mycor}OOOOOO\hspace*{\mycor}}}\\%
\end{document}

insira a descrição da imagem aqui

informação relacionada