
Eu uso uma versão modificada da solução TikZ emoutra perguntapara desenhar retângulos arredondados ao redor de algum texto para marcá-lo como um botão de um programa. Não há problema para caracteres únicos, mas se eu usar termos mais longos (como os botões são nomeados em meu programa), terei problemas com \hboxes excessivamente cheios.
MWE:
\documentclass[a4paper,10pt]{scrartcl}
\usepackage{tikz}
\newcommand*\rectangled[1]{\tikz[baseline=(char.base)]{
\node[shape=rectangle,draw,inner sep=2pt, rounded corners=4pt, thick] (char) {\sffamily{#1}};}}
\begin{document}
A rectangled number \rectangled{1}: No problem normally as it is used as normal charakter and TeX can set it in the right position.
A button with a longer name is marked using the same command and \rectangled{creates an Overfull \textbackslash hbox} if it is set to the end of a line.
\end{document}
A saída produzida é semelhante a esta:
Existe uma solução melhor para evitar tais \hboxes excessivamente cheias do que reorganizar a frase até que ela não produza mais problemas?
Responder1
A sloppypar
permitirá momentaneamente que você supere o problema. Este problema surge para qualquer caixa de grandes dimensões que queira ser composta no final de uma linha.
O sloppypar
recurso (ou \sloppy
para todo o documento) altera as penalidades do TeX para dar mais ênfase em evitar excessos de margem, em detrimento de espaços entre palavras muito amplos. Nao tem almoço gratis."
\documentclass[a4paper,10pt]{scrartcl}
\usepackage{tikz}
\newcommand*\rectangled[1]{\tikz[baseline=(char.base)]{
\node[shape=rectangle,draw,inner sep=2pt, rounded corners=4pt, thick] (char) {\sffamily#1};}}
\begin{document}
A rectangled number \rectangled{1}: No problem normally as it is used as normal charakter and TeX can set it in the right position.
\begin{sloppypar}
A button with a longer name is marked using the same command and \rectangled{creates an Overfull \textbackslash hbox} if it is set to the end of a line.
\end{sloppypar}
\end{document}
Responder2
Aqui está uma versão que permite quebras de linha e usa um retângulo aberto em ambas as partes. \tikzmark
é usado para marcar o início e o fim do texto e as formas ovais são desenhadas após a composição do texto:
Notas:
Isso requer duas execuções. O primeiro para determinar os locais e o segundo para fazer o desenho.
Isso não funcionará se o texto ultrapassar os limites da página.
O valor de
\RoundedCorner
não pode ser maior que o valor atual de2.0pt
, caso contrário, acabará com artefatos no canto arredondado. Talvez um desenho manualarc
possa ser usado se um raio maior for desejado.O valor de
\InnerSep
pode ser ajustado para ajustar o espaçamento horizontal adicional adicionadoantesedepoiso texto.O
\tikzmark
é deAdicionando uma chave grande ao lado do corpo do texto.Você pode descomentaro
showframe
pacote para ver as margens da página.
Código:
\documentclass{article}
%\usepackage{showframe}% to see page boundaries
\usepackage{tikz,tikzpagenodes}
\usetikzlibrary{decorations.pathreplacing}
\newcommand*{\InnerSep}{1pt}% Only applied to x directions
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node[inner sep=0] (#1) {};}
%% https://tex.stackexchange.com/questions/33703/extract-x-y-coordinate-of-an-arbitrary-point-in-tikz
\newdimen\XCoordA
\newdimen\YCoordA
\newdimen\XCoordB
\newdimen\YCoordB
\newcommand*{\ExtractCoordinate}[3]{\path (#3); \pgfgetlastxy{#1}{#2};}%
\newcommand*{\RoundedCorner}{2.0pt}% <-- MUST NOT BE ANY LARGER
\tikzset{My Line Style/.style={rounded corners=\RoundedCorner, thick, blue}}
\newcommand*\rectangled[2][]{%
\tikzmark{Start Mark}#2\tikzmark{End Mark}%
\begin{tikzpicture}[overlay,remember picture]
\ExtractCoordinate{\XCoordA}{\YCoordA}{Start Mark}
\ExtractCoordinate{\XCoordB}{\YCoordB}{End Mark}
\ifdim\YCoordA=\YCoordB% Starts and ends on same line
\draw[My Line Style,#1]
([shift={(-\InnerSep,-0.3*\baselineskip)}]Start Mark.south east)
rectangle
([shift={(\InnerSep,0.7*\baselineskip)}]End Mark.north west)
;
\else% Starts on a different line
\coordinate (Right Hand Edge) at (Start Mark -| current page text area.east);
\coordinate (Left Hand Edge) at (End Mark -| current page text area.west);
\draw [My Line Style,#1]% Draw start of oval rectangle
([yshift=-0.3*\baselineskip]Right Hand Edge)
-| ([xshift=-\InnerSep]Start Mark.west)
|- ([yshift=0.7*\baselineskip]Right Hand Edge)
;
\draw [My Line Style,#1]% Draw end of oval rectangle
([yshift=-0.3*\baselineskip]Left Hand Edge)
-| ([xshift=\InnerSep]End Mark.east)
|- ([yshift=0.7*\baselineskip]Left Hand Edge)
;
\fi%
\end{tikzpicture}%
}
\begin{document}
A rectangled number \rectangled{1}, or \rectangled[magenta]{word}: No problem
normally as it is used as normal character and TeX can set it in the right position.
A button with a longer name marked using the same command \rectangled[red]{used to
create an Overfull \textbackslash hbox} if it was set to the end of a line.
A button with a even longer name \rectangled[brown]{no longer creates a Overfull
\textbackslash hbox when it crosses a line} boundary.
\end{document}