小圆圈将被文字覆盖

小圆圈将被文字覆盖

我该如何定义一个命令来绘制一个小圆圈,以文本中的该位置为中心,然后将其覆盖。我希望通过以下序列生成类似于下图的内容Te\myredcircle{}xt

圆圈被文字覆盖

我打算使用它来不妨碍地显示地标,例如批判版中不同来源的文本的行或分页符。我已将问题标记为,tikz-pgf因为我相信这可能是一个可用于此目的的工具,但我不确定它是否是。

更新:看到任何使用 tikz 的解决方案都需要相当长的时间才能编译,而且圆圈并不那么复杂,我想到了一个不使用它的解决方案,并找到了一个几乎令人满意的解决方案,但我仍然希望圆圈以命令所在的点为中心,而不仅仅是开始。我尝试在圆圈前后拆分负字距,这确实会将其移动到所需位置,但会覆盖其前面的部分字母。这部分似乎很棘手。哦,圆圈只是一个例子,以后我可能会使用其他符号。

\documentclass{article}
\usepackage{xcolor}
\usepackage{calc}
\newcommand\redcircle{{\huge\textcolor{red}{$\bullet$}}}
\newlength{\circlelength}
\setlength{\circlelength}{\widthof{\redcircle}}
\newcommand\myredcircle{\redcircle{}\kern -\circlelength}

\begin{document}
Some te\myredcircle{}xt.  Some more text.
\end{document}

再试一次

答案1

使用picture模式。

\documentclass{article}
\usepackage{xcolor}
\begin{document}
\begin{picture}(0,0)
  \put(0,3){\color{red}\circle*{50}}
  \put(0,0){\hbox to 0pt{\hss Text\hss}}
\end{picture}
\end{document}

在此处输入图片描述

答案2

使用tikzmark,我们可以在页面上想要画圆圈的位置做个标记,然后在“之后”画出来,只需要使用一点点魔法,“之后”就会神奇地变成“之前”。

(注意:我不是运输方面的专家,所以我不能保证这点运输问题不会破坏某些关键的东西。其他人也许能够修复或保证这一点。

我使用 L3 是因为它让程序员的工作变得更轻松,但似乎没有 L3 原生方式来连接 shipout toks,而且我不确定 L3 版本是什么\newtoks。再次希望专家能够对此进行评估。)

由于使用tikzmark,需要运行两次才能将圆圈放置在正确的位置。

tikzmark 圆圈

\documentclass{article}
%\url{http://tex.stackexchange.com/q/312691/86}

\usepackage{tikz}
\usetikzlibrary{tikzmark}
\usepackage{xparse}

\ExplSyntaxOn

\seq_new:N \l__page_marks_seq
\seq_new:N \l__page_marks_tmp_seq

\int_new:N \l__page_marks_int
\int_zero:N \l__page_marks_int

\DeclareDocumentCommand \Circle {} {
  \int_gincr:N \l__page_marks_int
  \tikzmark{circle-\int_use:N \l__page_marks_int}
  \seq_gpush:NV \l__page_marks_seq \l__page_marks_int
}

\tl_const:Nx \c__colon_tl { \token_to_str:N : }


\DeclareDocumentCommand \doCircles {} {
  \seq_clear:N \l__page_marks_tmp_seq
  \seq_map_inline:Nn \l__page_marks_seq {
    \iftikzmark{circle-##1}{
      \int_compare:nT { \use:c {save@pg@\use:c{save@pt@circle-##1}} == \value{page}} {
        \tikz[remember~ picture,overlay] \fill[red] (pic~ cs\tl_use:N \c__colon_tl circle-##1) ++(0,6pt) circle [radius=6pt];
      }
    }{
      \seq_push:Nn \l__page_marks_tmp_seq {##1}
    }
  }
  \seq_gset_eq:NN \l__page_marks_seq \l__page_marks_tmp_seq
}


\newtoks\orig_output
\orig_output=\output
\output={%
  \setbox255=\vbox
  {
    \doCircles
    \unvbox255
  }
  \the\orig_output
}

\ExplSyntaxOff



\begin{document}

Te\Circle xt

\newpage

Some more te\Circle xt.

\newpage

Yet more text that should have a ci\Circle rcle in it.

\end{document}

2016 年 6 月 4 日更新

OP 表示更喜欢非 TikZ 解决方案。以下内容将 替换tikzmarkzref-savepos和,tikztextblock使用 OP 的循环代码。除此之外,它本质上是与上述相同的解决方案。

\documentclass{article}
%\url{http://tex.stackexchange.com/q/312691/86}

\usepackage[user,savepos]{zref}
\usepackage[absolute]{textpos}
\usepackage{xparse}
\usepackage{xcolor}
\usepackage{calc}

\newcommand\redcircle{{\huge\textcolor{red}{$\bullet$}}}
\newlength{\circlelength}
\setlength{\circlelength}{\widthof{\redcircle}}
\newcommand\myredcircle{\redcircle{}\kern -\circlelength}

\ExplSyntaxOn

\makeatletter
\cs_set_eq:NN \zref_get_prop:nn \zref@extract
\makeatother

\seq_new:N \l__page_marks_seq
\seq_new:N \l__page_marks_tmp_seq

\int_new:N \l__page_marks_int
\int_zero:N \l__page_marks_int

\DeclareDocumentCommand \Circle {} {
  \int_gincr:N \l__page_marks_int
  \zsavepos{circle-pos-\int_use:N \l__page_marks_int}
  \zlabel{circle-page-\int_use:N \l__page_marks_int}
  \seq_gpush:NV \l__page_marks_seq \l__page_marks_int
}

\tl_const:Nx \c__colon_tl { \token_to_str:N : }

\dim_new:N \l__page_marks_x_dim
\dim_new:N \l__page_marks_y_dim
\dim_new:N \l__page_marks_w_dim
\dim_set:Nn \l__page_marks_w_dim {\circlelength}


\DeclareDocumentCommand \doCircles {} {
  \group_begin:
  \seq_clear:N \l__page_marks_tmp_seq
  \seq_map_inline:Nn \l__page_marks_seq {
    \int_compare:nTF {\zref_get_prop:nn {circle-page-##1} {page} == \value{page}}
    {
    \dim_set:Nn \l__page_marks_x_dim {\zposx{circle-pos-##1} sp}
    \dim_set_eq:NN \l__page_marks_y_dim \pdfpageheight
    \dim_sub:Nn \l__page_marks_y_dim {\zposy{circle-pos-##1} sp}
      \begin{textblock*}{\dim_use:N \l__page_marks_w_dim}[0.5,1](\dim_use:N \l__page_marks_x_dim, \dim_use:N \l__page_marks_y_dim)
    \noindent \myredcircle
      \end{textblock*}
    }
    {
      \seq_push:Nn \l__page_marks_tmp_seq {##1}
    }
  }
  \seq_gset_eq:NN \l__page_marks_seq \l__page_marks_tmp_seq
  \group_end:
}


\newtoks\orig_output
\orig_output=\output
\output={%
  \setbox255=\vbox
  {
    \doCircles
    \unvbox255
  }
  \the\orig_output
}

\ExplSyntaxOff



\begin{document}

Te\Circle xt

\newpage

Some more te\Circle xt.

\newpage

Yet more text that should have a ci\Circle rcle in it.

\end{document}

答案3

这里有一个非理想,但方法很简单,使用 OP 要求的语法Te\myredcircle{}xt。它绘制不透明的圆圈,这样之前写的内容(本例中为“Te”)虽然被遮挡,但仍然可见。根据您的应用,这可能是或可能不可接受的。

正如我在对 OP 的评论中提到的那样,请求的语法很难使用,因为它只在设置了先前的文本之后才请求圆圈,而没有事先警告。

\documentclass{article}
\usepackage{tikz}
\newcommand\myredcircle{\smash{\raisebox{-5pt}{\makebox[0pt]{%
  \tikz\node[inner sep=0pt, opacity=0.4]{\textcolor{red}{%
  \scalebox{3.3}{$\bullet$}}};}}}}
\begin{document}
\sffamily
Te\myredcircle{}xt
\end{document}

在此处输入图片描述

如果允许改变语法,\myredcircle{Te}xt那么宏就知道文本不是覆盖,就变得更容易了:

\documentclass{article}
\usepackage{tikz}
\newcommand\myredcircle[1]{\leavevmode\phantom{#1}\smash{\raisebox{-5pt}{\makebox[0pt]{%
  \tikz\node[inner sep=0pt]{\textcolor{red}{%
  \scalebox{3.3}{$\bullet$}}};}}}\llap{#1}}
\begin{document}
\sffamily
\myredcircle{Te}xt
\end{document}

在此处输入图片描述

答案4

这是一个使用和的简短解决方案pstricksxstring我定义了一个\InsertCircle命令,带有一个可选参数(插入圆圈之前的字符数)和一个强制参数(字符串)。

\documentclass[12pt, x11names, border=3pt]{standalone}
\usepackage{pst-node} \usepackage{auto-pst-pdf}
\usepackage{xstring}

\newcommand\InsertCircle[2][1]{\begin{postscript}\pnode{Ins}\StrLeft{#2}{#1}\Cnode*[linecolor=Tomato1, radius=1.6ex](0, 0.5ex){A}\rput[Bl](Ins){#2}\end{postscript}}

\begin{document}

\InsertCircle[2]{Text}

\end{document} 

在此处输入图片描述

相关内容