Tikz: используйте длину латекса для длины пути (отметки то же самое)

Tikz: используйте длину латекса для длины пути (отметки то же самое)

Я хочу нарисовать такую ​​же линию, то есть горизонтальную линию с двумя маленькими отметками посередине.

Моя первая попытка была \dittoLatexс использованием коробки с персонажами и правилами, но она была откровенно уродлива.

Моя вторая попытка \dittotikzAвыглядит намного лучше, но не вычисляет ширину автоматически из аргумента.

Моя третья попытка заключается в том, \dittotikzBчто я пытаюсь использовать тот же метод для расчета ширины, что и \dittoLatex, но это не работает. Я подозреваю, что проблема в несовпадении единиц, но я не могу понять, как это исправить.

МВЭ:

\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}

пример

Некоторые сопутствующие вопросы:

решение1

Вы забыли знаки умножения. 4\xfactor — это не 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}

Связанный контент