
Utilizo una versión modificada de la solución TikZ enotra preguntadibujar rectángulos redondeados alrededor de un texto para marcarlo como un botón de un programa. No hay problema para caracteres individuales, pero si uso términos más largos (como se nombran los botones en mi programa) tengo problemas con \hboxes Overfull.
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}
El resultado producido se ve así:
¿Existe una mejor solución para evitar tales \hboxes demasiado llenos que reorganizar la oración hasta que ya no produzca ningún problema?
Respuesta1
A sloppypar
le permitirá momentáneamente superar el problema. Este problema surge para cualquier cuadro de gran tamaño que quiera escribirse al final de una línea.
La sloppypar
característica (o \sloppy
para todo el documento) cambia las penalizaciones de TeX para dar más énfasis a evitar excesos de margen, a expensas de espacios entre palabras extremadamente amplios. No hay almuerzo 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}
Respuesta2
Aquí hay una versión que permite saltos de línea y utiliza un rectángulo abierto en ambas partes. \tikzmark
se utiliza para marcar el inicio y el final del texto y los óvalos se dibujan después de que el texto ha sido tipografiado:
Notas:
Esto requiere dos ejecuciones. El primero para determinar las ubicaciones y el segundo para hacer el dibujo.
Esto no funcionará si el texto cruza los límites de la página.
El valor de
\RoundedCorner
no puede ser mayor que el valor actual de2.0pt
; de lo contrario, terminará con artefactos en la esquina redondeada. Quizásarc
se podría utilizar un dibujo manual si se desea un radio mayor.El valor de
\InnerSep
se puede modificar para ajustar el espacio horizontal adicional que se agregaantesydespuésel texto.El
\tikzmark
es deAgregar una llave grande al lado de un cuerpo de texto.Puedes descomentarel
showframe
paquete para ver los márgenes de la 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}