该命令\hrulefill
打印一行,用一行填充所有空白水平空间。我想用 做类似的事情TikZ
。
我想知道的是,我可以做类似的事情吗
\noindent Some text \hrulefill
和TikZ
?
我想要做的是能够TikZ
确定边距的 x 坐标,以便我可以执行类似以下操作
\tikz Some text \draw [dashed] (0,0) -- (end of textwidth,0);
欲了解更多信息,您可以查看我的回答用剪刀符号插入水平切割线的最佳方法。
答案1
基于包的解决方案zref-savepos
\documentclass{article}
\usepackage{tikz}
\usepackage{zref-savepos,zref-user}
\providecommand*{\zsaveposx}{\zsavepos}% for older versions
\newcounter{dashlinecnt}
\renewcommand*{\thedashlinecnt}{%
dashline-\the\value{dashlinecnt}%
}
\newcommand*{\dashedlinefill}{%
\leavevmode
\stepcounter{dashlinecnt}%
\zsaveposx{\thedashlinecnt-a}%
\zrefused{\thedashlinecnt-a}%
% \zrefused{\thedashlinecnt-b}% can be omitted
\rlap{%
\tikz\draw[dashed](0,0) -- %
(\zposx{\thedashlinecnt-b}sp-\zposx{\thedashlinecnt-a}sp,0);%
}%
\hfill
\zsaveposx{\thedashlinecnt-b}%
}
\begin{document}
\noindent
A\hfill B
\noindent
Hello World \dashedlinefill
\end{document}
基于tikz
'的解决方案remember picture
(更新:overlay
已添加第一个\tikz
命令。)
这将在章节中解释16.13 引用当前图片之外的节点。该示例还需要overlay
第一个\tikz
命令的选项,以避免第一个节点的偏移和略微倾斜的线。
(第二次更新:)原因是\tikz
使用的绘图区域宽度和高度最小为1pt
。因此overlay
,
minimum width=0pt,
minimum height=0pt,
可以用于第一个。当然\tikz
第二个\tikz
仍然需要。overlay
\documentclass{article}
\usepackage{tikz}
\newcounter{dashlinecnt}
\renewcommand*{\thedashlinecnt}{%
dashline-\the\value{dashlinecnt}%
}
\newcommand*{\dashedlinefill}{%
\leavevmode
\stepcounter{dashlinecnt}%
\tikz[remember picture,overlay,inner sep=0pt]\node(\thedashlinecnt){};%
\hfill
\tikz[remember picture,overlay,inner sep=0pt]\draw[dashed](\thedashlinecnt) -- (0,0);%
}
\begin{document}
\noindent
A\hfill B
\noindent
Hello World \dashedlinefill
\end{document}
此解决方案也需要运行两次 LaTeX。但是,在这种情况下,不会提供重新运行警告tikz
。
答案2
如果你只想填充当前行,那么你可以在之后使用宏\tikz ...;
\documentclass{article}
\usepackage{showframe}
\usepackage{tikz}
\pagestyle{empty}
\makeatletter
\def\hdashfill{%
\leavevmode%
\cleaders \hb@xt@ 7pt{\hss\rule[1ex]{4pt}{0.5pt}\rule{3pt}{0pt}}\hfill\kern\z@}
\makeatother
\begin{document}
Some text \hdashfill
\tikz\node at(0,0){Some text};\hdashfill
\end{document}
答案3
这是一个谦虚的尝试:
代码:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\newlength{\sometext}
\settowidth{\sometext}{Some Text }
\noindent Some Text \tikz \draw[dashed](0,0)--({\linewidth-\sometext},0);
%Another variant that Percusse suggested on chat, thanks to Percusse
%This works better in terms of output than the above. I guess the space after
%text in "Some text " is not being counted.
\noindent Some Text \tikz{\pgfmathsetmacro{\mylen}{width("Some Text ")}
\draw[dashed](0,0)-- ({\the\linewidth-\mylen},0);}
\noindent\tikz \draw[dashed](0,0)--({\textwidth-0.4},0);
\end{document}
输出
致谢
感谢 Andrew Stacey 对这段代码提供了大量帮助,以及 Percusse 提出的一些完善建议,这让我不禁想知道我的贡献是什么。