我该如何定义一个命令来绘制一个小圆圈,以文本中的该位置为中心,然后将其覆盖。我希望通过以下序列生成类似于下图的内容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
答案2
使用tikzmark
,我们可以在页面上想要画圆圈的位置做个标记,然后在“之后”画出来,只需要使用一点点魔法,“之后”就会神奇地变成“之前”。
(注意:我不是运输方面的专家,所以我不能保证这点运输问题不会破坏某些关键的东西。其他人也许能够修复或保证这一点。
我使用 L3 是因为它让程序员的工作变得更轻松,但似乎没有 L3 原生方式来连接 shipout toks,而且我不确定 L3 版本是什么\newtoks
。再次希望专家能够对此进行评估。)
由于使用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 解决方案。以下内容将 替换tikzmark
为zref-savepos
和,tikz
并textblock
使用 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
这是一个使用和的简短解决方案pstricks
。xstring
我定义了一个\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}