Tikz: use la longitud del látex para la longitud del camino (lo mismo ocurre con las marcas)

Tikz: use la longitud del látex para la longitud del camino (lo mismo ocurre con las marcas)

Quiero dibujar una línea ídem, que es una línea horizontal con dos pequeñas marcas en el medio.

Mi primer intento fue \dittoLatexel que utiliza un cuadro con personajes y reglas, pero es francamente feo.

Mi segundo intento fue \dittotikzAque se ve mucho mejor, pero no calcula su ancho automáticamente a partir de un argumento.

Mi tercer intento es \dittotikzBintentar utilizar el mismo método para calcular el ancho que \dittoLatex, pero no funciona. Sospecho que el problema se debe a que las unidades no coinciden, pero no sé cómo solucionarlo.

MWE:

\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{xparse}

\makeatletter

\usepackage{tikz}
\usetikzlibrary{math}

\newcommand\dittotikzA[1][3em]{%
    \def\x{#1/4}%
    %\show\x%
    \def\y{#1*.01}%
    \begin{tikzpicture}[x=1ex,y=1ex,baseline=-.5ex,cap=round]
        \draw (0,0) sin (1*\x,\y) cos (2*\x,0) sin (3*\x,-\y) cos (4*\x,0);
        \draw[xshift=-.2ex, bend right=20] (2*\x-.5,-.5) edge (2*\x+.5,.5);
        \draw[xshift=.2ex, bend right=20] (2*\x-.5,-.5) edge (2*\x+.5,.5);
    \end{tikzpicture}%
}


\newlength{\ditto@width}
\NewDocumentCommand\dittotikzB{ s O{1em} m }{%
    % #1 = starred means horizontal line along entire width, unstarred means no line (only ditto marks)
    % #2 = minimum width
    % #3 = string to use for calculating width
    \settowidth{\ditto@width}{#3}%
    %\show\ditto@width%
    \edef\w{\ifdim#2<\ditto@width\the\ditto@width\else#2\fi}
    %\show\w%
    \begin{tikzpicture}[x=1ex,y=1ex,baseline=-.5ex,cap=round]
        \tikzmath{
            \xfactor = \w / 4 * 1pt/1ex;
            \yfactor = .175;
        };
        %\show\xfactor;
        %\show\yfactor;
        \IfBooleanT{#1}{% starred
            \draw (0,0) sin (1\xfactor, \yfactor) cos (2\xfactor, 0) sin (3\xfactor, -\yfactor) cos (4\xfactor, 0);
        };
        \draw[xshift=-.2ex, bend right=20] (2\xfactor - .5, -.5) edge (2\xfactor + .5, .5);
        \draw[xshift=.2ex, bend right=20] (2\xfactor - .5, -.5) edge (2\xfactor + .5, .5);
    \end{tikzpicture}%
}


\usepackage{xhfill}
\newcommand\ditto@symbol{%
    ||%
}
\NewDocumentCommand\dittoLatex{ s O{1em} m }{%
    % #1 = starred means horizontal line along entire width, unstarred means no line (only ditto marks)
    % #2 = minimum width
    % #3 = string to use for calculating width
    \settowidth{\ditto@width}{#3}%
    \makebox[{\ifdim#2<\ditto@width\ditto@width\else#2\fi}]{%
        \IfBooleanTF{#1}{% starred
            \xrfill[.5ex]{.4pt}%
            \ditto@symbol%
            \xrfill[.5ex]{.4pt}%
        }{%
            \ditto@symbol%
        }%
    }%
}

\makeatother

\begin{document}

\let\ditto=\dittotikzA
\noindent
blah blah \ditto{} blah blah\\
blah blah \ditto[10em]{} blah blah\\

\let\ditto=\dittotikzB
\noindent
blah blah Test blah blah\\
blah blah \ditto{Test} blah blah\\
blah blah \ditto*{Test} blah blah\\
blah blah Testing testing blah blah\\
blah blah \ditto{Testing testing} blah blah\\
blah blah \ditto*{Testing testing} blah blah\\
blah blah \ditto{} blah blah\\
blah blah \ditto*{} blah blah\\
blah blah \ditto[10em]{Test} blah blah\\
blah blah \ditto*[10em]{Test} blah blah\\
blah blah \ditto[10em]{Testing testing} blah blah\\
blah blah \ditto*[10em]{Testing testing} blah blah\\
blah blah \ditto[10em]{} blah blah\\
blah blah \ditto*[10em]{} blah blah\\

\let\ditto=\dittoLatex
\noindent
blah blah Test blah blah\\
blah blah \ditto{Test} blah blah\\
blah blah \ditto*{Test} blah blah\\
blah blah Testing testing blah blah\\
blah blah \ditto{Testing testing} blah blah\\
blah blah \ditto*{Testing testing} blah blah\\
blah blah \ditto{} blah blah\\
blah blah \ditto*{} blah blah\\
blah blah \ditto[10em]{Test} blah blah\\
blah blah \ditto*[10em]{Test} blah blah\\
blah blah \ditto[10em]{Testing testing} blah blah\\
blah blah \ditto*[10em]{Testing testing} blah blah\\
blah blah \ditto[10em]{} blah blah\\
blah blah \ditto*[10em]{} blah blah\\

\end{document}

ejemplo

Algunas preguntas relacionadas:

Respuesta1

Olvidaste los signos de multiplicación. 4\xfactor no es 4*\xfactor.

\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{xparse}

\makeatletter

\usepackage{tikz}
\usetikzlibrary{math}
\newcommand\w{}
\newlength{\ditto@width}
\NewDocumentCommand\dittotikzB{ s O{1em} m }{%
    % #1 = starred means horizontal line along entire width, unstarred means no line (only ditto marks)
    % #2 = minimum width
    % #3 = string to use for calculating width
    \settowidth{\ditto@width}{#3}%
    %\show\ditto@width%
    \edef\w{\ifdim#2<\ditto@width\the\ditto@width\else\dimexpr#2\relax\fi}
    %\show\w%
    \begin{tikzpicture}[x=1ex,y=1ex,baseline=-.5ex,cap=round]
        \tikzmath{
            \xfactor = \w / 4 * 1pt/1ex;
            \yfactor = .175;
        };
        %\show\xfactor;
        %\show\yfactor;
        \IfBooleanT{#1}{% starred
            \draw (0,0) sin (1*\xfactor, \yfactor) cos (2*\xfactor, 0) sin (3*\xfactor, -\yfactor) cos (4*\xfactor, 0);
        };
        \draw[xshift=-.2ex, bend right=20] (2*\xfactor - .5, -.5) edge (2*\xfactor + .5, .5);
        \draw[xshift=.2ex, bend right=20] (2*\xfactor - .5, -.5) edge (2*\xfactor + .5, .5);
    \end{tikzpicture}%
}



\makeatother

\begin{document}

\let\ditto=\dittotikzB
\noindent
blah blah Test blah blah\\
blah blah \ditto{Test} blah blah\\
blah blah \ditto*{Test} blah blah\\
blah blah Testing testing blah blah\\
blah blah \ditto{Testing testing} blah blah\\
blah blah \ditto*{Testing testing} blah blah\\
blah blah \ditto{} blah blah\\
blah blah \ditto*{} blah blah\\
blah blah \ditto[10em]{Test} blah blah\\
blah blah \ditto*[10em]{Test} blah blah\\
blah blah \ditto[10em]{Testing testing} blah blah\\
blah blah \ditto*[10em]{Testing testing} blah blah\\
blah blah \ditto[10em]{} blah blah\\
blah blah \ditto*[10em]{} blah blah\\



\end{document}

información relacionada