代码:

代码:

该命令\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}

使用 zref-savepos 的结果

基于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

基于 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 提出的一些完善建议,这让我不禁想知道我的贡献是什么。

相关内容