Nó TikZ como caractere no texto

Nó TikZ como caractere no texto

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: Saída do MWE

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 sloppyparpermitirá 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 sloppyparrecurso (ou \sloppypara 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}

insira a descrição da imagem aqui

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:

insira a descrição da imagem aqui

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 \RoundedCornernão pode ser maior que o valor atual de 2.0pt, caso contrário, acabará com artefatos no canto arredondado. Talvez um desenho manual arcpossa ser usado se um raio maior for desejado.

  • O valor de \InnerSeppode 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 showframepacote 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}

informação relacionada