Quero desenhar uma linha idem, que é uma linha horizontal com duas pequenas marcas no meio.
Minha primeira tentativa foi \dittoLatex
usar uma caixa com personagens e regras, mas é francamente feia.
Minha segunda tentativa foi \dittotikzA
que parece muito melhor, mas não calcula sua largura automaticamente a partir de um argumento.
Minha terceira tentativa é \dittotikzB
tentar usar o mesmo método para calcular a largura \dittoLatex
, mas não funciona. Suspeito que o problema seja com unidades incompatíveis, mas não consigo descobrir como consertar.
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}
Algumas questões relacionadas:
Responder1
Você esqueceu os sinais de multiplicação. 4\xfator não é 4*\xfator.
\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}