Nodo TikZ como carácter en texto

Nodo TikZ como carácter en texto

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í: Producción de MWE

¿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 sloppyparle 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 sloppyparcaracterística (o \sloppypara 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}

ingrese la descripción de la imagen aquí

Respuesta2

Aquí hay una versión que permite saltos de línea y utiliza un rectángulo abierto en ambas partes. \tikzmarkse utiliza para marcar el inicio y el final del texto y los óvalos se dibujan después de que el texto ha sido tipografiado:

ingrese la descripción de la imagen aquí

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 \RoundedCornerno puede ser mayor que el valor actual de 2.0pt; de ​​lo contrario, terminará con artefactos en la esquina redondeada. Quizás arcse 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 descomentarelshowframe 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}

información relacionada