是否可以定义一个删除所有文本(即使在枚举列表中)的环境?
我基本上是在尝试自动化目前在 Microsoft Word 中手动完成的工作。我有一段文本,系统会告诉我哪些部分是新的,哪些部分没有改变,哪些部分自上次更新以来已被删除。
新添加的文本必须以粗体显示(这很简单),但任何被删除的内容都需要被删除。soul
和ulem
包部分地解决了这个问题,尽管它们可以删除整个段落,但当一次给出多个段落时它们会失败。 我也无法做到这一点\sout{\begin{enumerate}\item asdf\end{enumerate}}
,例如,如果我只是用 包裹每个\item
段落\sout
,那么实际的项目编号仍然不会显示为删除。
我试图删除的文本类型基本上仅限于普通段落文本和嵌套枚举列表(即没有数学,没有图形,没有数字,没有标题等),并且每个新的/删除的区域很可能永远不会超过半页。
我并不追求精确或美观,例如,如果删除线横跨整个页面宽度,只是为了删除一个单词,那就没问题。我也愿意听取有关排版已删除文本的其他方法的建议。
我目前所拥有的都是借鉴自@Werner 的回答在这里,我可以在段落的每一行上放置一条水平线,但它会使枚举列表失效。
\documentclass[a4paper]{article}
\usepackage{lipsum}
\newbox\strikeoutlinebox
% sorry for the messy boxes ... is there a cleaner way?
\def\strikeoutline{%
\vbox to 0pt{%
\vskip -4pt%
\hbox to 0pt{%
\vbox{\hsize\wd\strikeoutlinebox\hrule width \hsize}%
\hskip 0pt minus 1fil%
}%
\vskip 0pt plus 1fil%
}%
\box\strikeoutlinebox
}
\def\fullstrikeout{%
\setbox\strikeoutlinebox\lastbox
\ifvoid\strikeoutlinebox
\noindent\ignorespaces
\else
\unskip\unpenalty
\begingroup\fullstrikeout\space\endgroup
\strikeoutline
\fi
}
% is this bad? it's probably bad ...
\newenvironment{strikethrough}{%
\begingroup
\let\oldpar=\par
\def\par{\oldpar\fullstrikeout}%
\vbox\bgroup
}{%
\par\egroup
\let\par=\oldpar
\endgroup
}
\begin{document}
\begin{strikethrough}
\lipsum[0-3]
\end{strikethrough}
\end{document}
以上是一个 WIP,但你可能已经看出我真的不知道自己在做什么。
答案1
值得一提的是,在 ConTeXt 中,该\overstike
宏可以很好地与枚举列表配合使用。以下是示例:
\starttext
\overstrike{
\startitemize[n]
\item \input ward
\startitemize[i]
\item \input zapf
\stopitemize
\item \input tufte
\stopitemize}
\stoptext
这使
答案2
也许您可以使用基于 Tikz 的东西。
选项1:
以下内容基于Gonzalo Medina 的回答:
\documentclass{article}
\usepackage{tikzpagenodes}
\usetikzlibrary{patterns}
\usetikzlibrary{calc}
\makeatletter
\tikzset{%
remember picture with id/.style={%
remember picture,
overlay,
save picture id=#1,
},
save picture id/.code={%
\edef\pgf@temp{#1}%
\immediate\write\pgfutil@auxout{%
\noexpand\savepointas{\pgf@temp}{\pgfpictureid}}%
},
if picture id/.code args={#1#2#3}{%
\@ifundefined{save@pt@#1}{%
\pgfkeysalso{#3}%
}{
\pgfkeysalso{#2}%
}
}
}
\def\savepointas#1#2{%
\expandafter\gdef\csname save@pt@#1\endcsname{#2}%
}
\def\tmk@labeldef#1,#2\@nil{%
\def\tmk@label{#1}%
\def\tmk@def{#2}%
}
\tikzdeclarecoordinatesystem{pic}{%
\pgfutil@in@,{#1}%
\ifpgfutil@in@%
\tmk@labeldef#1\@nil
\else
\tmk@labeldef#1,(0pt,0pt)\@nil
\fi
\@ifundefined{save@pt@\tmk@label}{%
\tikz@scan@one@point\pgfutil@firstofone\tmk@def
}{%
\pgfsys@getposition{\csname save@pt@\tmk@label\endcsname}\save@orig@pic%
\pgfsys@getposition{\pgfpictureid}\save@this@pic%
\pgf@process{\pgfpointorigin\save@this@pic}%
\pgf@xa=\pgf@x
\pgf@ya=\pgf@y
\pgf@process{\pgfpointorigin\save@orig@pic}%
\advance\pgf@x by -\pgf@xa
\advance\pgf@y by -\pgf@ya
}%
}
\newcommand\tikzmark[2][]{%
\tikz[remember picture with id=#2] #1;}
\makeatother
\newcommand\BoxedText[3][]{%
\begin{tikzpicture}[remember picture,overlay]
\draw[#1]
let \p1=(pic cs:#2), \p2=(pic cs:#3) in
([yshift=-0.8ex]\p1) --
([yshift=2ex]\p1) --
([xshift=3pt,yshift=2ex]\p1-|current page text area.east) --
([xshift=3pt,yshift=2ex]\p2-|current page text area.east) --
([yshift=2ex]\p2) --
([yshift=-0.8ex]\p2) --
([xshift=-3pt,yshift=-0.8ex]\p2-|current page text area.west) --
([xshift=-3pt,yshift=-0.8ex]\p1-|current page text area.west) --
cycle
;
\end{tikzpicture}%
}
\usepackage{lipsum}
\begin{document}
\BoxedText[pattern=horizontal lines]{start1}{end1}
\BoxedText[draw=gray!70!black,fill=gray!50,ultra thick]{start2}{end2}
Some text goes here.\tikzmark{start1} \lipsum[1]
\begin{enumerate}
\item An item
\item Another item
\item Final item
\end{enumerate}
\lipsum[2]
\section{A section head}
A line of text.
\tikzmark{end1}
After the strikeout. Some text goes here. Some text goes here. Some
text goes here. Some text goes here.Some text goes
here.\tikzmark{start2} Some text goes here. Some text goes here. Some
text goes here. Some text goes here. Some text Some text goes
here.\tikzmark{end2}
\end{document}
缺点是,每个需要标记的部分都必须\tikzmark
定义自己的开始和结束。请注意,LaTeX 必须运行三次才能生成正确的 PDF。
选项 2:
如果文本始终是完整的段落(而不是像选项 1 那样在句子中间开始或结束),则可以使用该mdframed
包,这样可以获得更简单的代码:
\documentclass{article}
\usepackage{lipsum}
\usepackage[framemethod=tikz]{mdframed}
\usetikzlibrary{patterns}
\mdfdefinestyle{strikeoutbox}{%
linecolor=black,%
apptotikzsetting={\tikzset{mdfbackground/.append style={%
draw=gray!10,pattern=horizontal lines}
%color=blue!20}
}},%
innertopmargin=\topskip,
}
\begin{document}
Some text goes here.
\begin{mdframed}[style=strikeoutbox]
\lipsum[1]
\begin{enumerate}
\item An item
\item Another item
\item Final item
\end{enumerate}
\lipsum[2]
\section{A section head}
A line of text.
\end{mdframed}
After the strikeout. Some text goes here. Some text goes here. Some
text goes here. Some text goes here.Some text goes
here. Some text goes here. Some text goes here. Some
text goes here. Some text goes here. Some text Some text goes
here.
\end{document}
结束语
对于这两个选项,您可以使用Philippe Goutet 的回答定制现有图案,以使条纹分开、颜色不同等。