我想修改我的论文,所以必须删除/添加/修改一些句子。我需要两个版本的手稿:
- 删除了句子,
- 没有删除的句子。
我使用了问题中提供的模板: 忽略除特定文本之外的所有内容
但是,我遇到了一些问题:
- 当我使用
\let\ignoreflag\relax
并编译我的代码(基于xelatex)时,三种不同类型的句子之间的距离被省略了。
当我省略使用时
\let\ignoreflag\relax
,出现以下错误:“!\xignore 的参数有一个额外的 }。\par”
并且再次省略了两种不同类型的句子之间的距离。
\documentclass{article}
\long\def\dontignore#1{#1}
\makeatletter
\long\def\ignoreflag{\@makeother\{\@makeother\}\xignore}
\long\def\xignore#1\dontignore#2{\catcode`\{\@ne\catcode`\}\tw@\afterassignment\xxdontignore\toks@\bgroup}
\long\def\xxdontignore{\the\toks@\ignoreflag}
\makeatother
\usepackage[dvipsnames]{xcolor}
\usepackage[normalem]{ulem}
\newcommand{\mydelete}[1]{\color{red}{\ignoreflag\sout{#1}}\color{black}}
\newcommand{\myadd}[1]{\textcolor{blue}{#1}\color{black}}
\newcommand{\need}[1]{\textsc{\textcolor{Maroon}{#1}}}
\let\ignoreflag\relax
\begin{document}
\dontignore
This is some text: \mydelete{I want to IGNORE this text OR TAKE IT INTO ACCOUNT} \myadd{I want to ADD this text} \need{I want to REVISE this text.}
\end{document}
答案1
我不知道所有这些\ignoreflag
东西想要达到什么目的,但是你不能更简单地来处理它吗?
\documentclass{article}
\usepackage[dvipsnames]{xcolor}
\usepackage[normalem]{ulem}
\newcommand{\ORIGmydelete}[1]{\textcolor{red}{\sout{#1}}}
\newcommand{\myadd}[1]{\textcolor{blue}{#1}}
\newcommand{\need}[1]{\textsc{\textcolor{Maroon}{#1}}}
\newcommand\ignore{\renewcommand\mydelete[1]{\ignorespaces}}
\newcommand\dontignore{\let\mydelete\ORIGmydelete}
\dontignore
\begin{document}
This is some text: \mydelete{I want to IGNORE this text OR TAKE IT INTO ACCOUNT} \myadd{I want to ADD this text} \need{I want to REVISE this text.}
\ignore
This is some text: \mydelete{I want to IGNORE this text OR TAKE IT INTO ACCOUNT} \myadd{I want to ADD this text} \need{I want to REVISE this text.}
\end{document}
答案2
您所指的解决方案提供了一种隐藏(或不隐藏)未包含在 中的所有文本的方法\dontignore
。由于您只想隐藏文本的一小部分,因此您需要在\dontignore
命令中包含除\mydelete
部分之外的所有文本。
因此,我建议不要使用该解决方案,而是做一些更简单的事情,如下所示:
\usepackage{etoolbox}
\newtoggle{ignoreflag}
\newcommand{\mydelete}[1]{\iftoggle{ignoreflag}{}{#1}}
\toggletrue{ignoreflag} %don't print the text
\togglefalse{ignoreflag} %print the text
(或 Steven 的回答中的做法)。由于只有\mydelete
shall 才有效,因此您只需要在定义中有一个简短的开关\mydelete
来打印或不打印某些内容。(这部分灵感来自这个答案。
{}
对于您的另一个问题:宏后的空格将被忽略。您可以通过在每个宏后添加另一个空格或添加显式空格来手动更改此设置\
。由于这相当麻烦,您可以xspace
像这样使用包:
\usepackage{xspace}
\newcommand{\myadd}[1]{#1\xspace}
它会自动检测宏后是否需要添加空格。但是,有几个人建议不要使用xspace
,因此请阅读他们的论点在决定这么做之前。
完整示例:
\documentclass{article}
\usepackage{xspace}
\usepackage[dvipsnames]{xcolor}
\usepackage[normalem]{ulem}
\usepackage{etoolbox}
\newtoggle{ignoreflag}
\newcommand{\mydelete}[1]{\iftoggle{ignoreflag}{}{\color{red}{\sout{#1}}\color{black}\xspace}}
\newcommand{\myadd}[1]{\textcolor{blue}{#1}\color{black}\xspace}
\newcommand{\need}[1]{\textsc{\textcolor{Maroon}{#1}}\xspace}
\begin{document}
\toggletrue{ignoreflag}
This is some text: \mydelete{I want to IGNORE this text OR TAKE IT INTO ACCOUNT} \myadd{I want to ADD this text} \need{I want to REVISE this text.}
\vspace{\baselineskip}
\togglefalse{ignoreflag}
This is some text: \mydelete{I want to IGNORE this text OR TAKE IT INTO ACCOUNT} \myadd{I want to ADD this text} \need{I want to REVISE this text.}
\end{document}