如何解决 comment.sty 和 changes.sty 中 \comment 的定义冲突而不影响任一方的界面?

如何解决 comment.sty 和 changes.sty 中 \comment 的定义冲突而不影响任一方的界面?

我正在写一个同时使用变化(v3.1.2)和评论(v3.8),并且我想向我的包的消费者公开它们的功能,而不必修改任何一个的界面。

问题是和都changes.sty定义comment.sty\comment。因此

\documentclass{article}
\usepackage{comment}
\usepackage{changes}
\begin{document}\end{document}

抛出错误

命令 \comment 已定义。

我知道这可以通过以下方式修复保存符号通过(本质上)修改changes.sty的界面,例如

\documentclass{article}
\usepackage{savesym}

\usepackage{changes}
\savesymbol{comment} % rename \comment -> \origcomment
\usepackage{comment}

\begin{document}
\origcomment{pdf comment using 'changes.sty'}
\begin{comment}
code comment using 'comment.sty'
\end{comment}
\end{document}

或者,comment.sty提供\excludecomment定义自定义评论环境,例如

\documentclass{article}
\usepackage{savesym}

\usepackage{comment}
\savesymbol{comment}
\excludecomment{mycomment}
\usepackage{changes}

\begin{document}
\comment{pdf comment using 'changes.sty'}
\begin{mycomment}
code comment using 'comment.sty'
\end{mycomment}
\end{document}

changes.sty破坏了默认comment环境。

是否可以在我的包中构建一个层,用于在命令和环境之间进行中介changes.sty\comment目的comment.stycomment将每个命令的原始界面暴露给我的包的消费者。


两个相互冲突的定义如下:

% changes.sty line 791
\newcommand{\comment}[2][\@empty]{%
\setkeys{Changes@comment}{#1}%
\Changes@output%
{comment}%
{\Changes@comment@id}%
{}%
{}%
{#2}%
{\changescommentname}%
{#2}%
}
% comment.sty line 241
\def\excludecomment
 #1{\message{Excluding comment '#1'}%
    \csarg\def{#1}{\endgroup \message{Excluding '#1' comment.}%
        \begingroup
           \DefaultCutFileName \def\ProcessCutFile{}%
           \def\ThisComment####1{}\ProcessComment{#1}}%
    \csarg\def{After#1Comment}{\CloseAndInputCutFile \endgroup}
    \CommentEndDef{#1}}
% ...
% line 292
\excludecomment{comment}

答案1

您可以通过\let保存注释包的环境\comment之下的宏和更改包附带的宏来做到这一点。comment\comment

然后,您可以定义自己的\comment-macro,它“查看”的定义\@currenvir

如果\@currenvir= comment,则执行\comment意味着调用 comment-environment 所依赖的宏。
否则,执行\comment意味着调用来自 changes-package 的宏。

请注意,在下面的例子中,我说了\includecomment{comment},评论环境的内容会产生视觉输出。

\documentclass{article}

\makeatletter
\newcommand*\UD@CommentName{comment}%
\newcommand\UDsavedcommentenvironment{}%
\newcommand\UDsavedcommentmacro{}%
\usepackage{changes}[2019/01/26 v3.1.2]
\let\UDsavedcommentmacro=\comment
\let\comment=\relax
\usepackage{comment}%[2016/07/16 v3.8]
\includecomment{comment}%
%\excludecomment{comment}%
\let\UDsavedcommentenvironment=\comment
\let\comment=\relax
\newcommand\comment{%
  \ifx\@currenvir\UD@CommentName
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
  {\UDsavedcommentenvironment}{\UDsavedcommentmacro}%
}%
\makeatother

\begin{document}
\null
\comment{A pdf comment using `changes.sty'.}%
\begin{comment}
A code comment using `comment.sty'.
\end{comment}
\comment{Another pdf comment using `changes.sty'.}%
\begin{comment}
Another code comment using `comment.sty'.
\end{comment}
Some text.
\end{document}

在此处输入图片描述

答案2

从 v4.0.0 开始,该changes包允许使用commandnameprefix如下选项进行初始化

\usepackage[commandnameprefix=always]{changes}

这将改变命令:

  • \添加 → \chadded
  • \已删除 → \ch已删除
  • \replaced → \chreplaced
  • \highlight → \chhighlight
  • \评论 → \ch评论

新的命令不太可能与现有的命令发生冲突。

最常见的是,像comment或 这样的命令highlight会导致冲突,因此人们可能有兴趣(并且能够)保留addedreplaced和 等命令deleted的原始形式。这可以通过以下方式实现:

\usepackage[commandnameprefix=ifneeded]{changes}

ch它只会覆盖必要的命令。请注意,这可能会导致-prefixed 命令和普通命令混合出现。

答案3

这是我根据@Ulrich Diez 的回答提出的解决方案,主要区别在于使用\@undefined而不是\relax和更简单的 if-then-else 语句:

\documentclass{article}

\makeatletter

\usepackage{comment}
\let\wfs@comment@comment\comment
\let\comment\@undefined

\usepackage{changes}
\let\wfs@changes@comment\comment
\let\comment\@undefined

\newcommand\comment{%
    \ifthenelse{\equal{\@currenvir}{comment}}
    {\wfs@comment@comment}
    {\wfs@changes@comment}%
}

\makeatother

\begin{document}
\comment{pdf comment 1}
\begin{comment}
code comment 1
\end{comment}
\comment{pdf comment 2}
\begin{comment}
code comment 2
\end{comment}
\end{document}

然后我将序言复制到我的包中,删除\makeatletter\makeatother,并替换为\usepackage-> \RequirePackage

答案4

尽管我\usepackage[commandnameprefix=always]{changes}按照@gijswijs 的建议添加了序言,但仍然收到错误:

LaTeX 错误:命令 \comment 已定义。 LaTeX 错误:命令 \highlight 已定义。

你能告诉我下面的序言有什么问题吗?

提前致谢!

\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{verbatim}
\usepackage{amsmath} 
\usepackage{mathtools}
\usepackage{graphicx}
\usepackage{amssymb}
\usepackage{float}
\usepackage{hyperref}
\usepackage{amsmath}
\usepackage[section]{placeins}
\usepackage[backend=biber,sorting=nyc,natbib,citestyle=authoryear, style=apa]{biblatex}

\usepackage[commandnameprefix=always]{changes}

\DeclareSortingScheme{nyc}{
  \sort{
    \field{presort}
  }
  \sort[final]{
    \field{sortkey}
  }
  \sort{
    \field{sortname}
    \field{author}
    \field{editor}
    \field{translator}
    \field{sorttitle}
    \field{title}
  }
  \sort{
    \field{sortyear}
    \field{year}
  }
  \sort{\citeorder}
}
\addbibresource{references.bib}
\usepackage[indent=0cm]{parskip}
\usepackage{xcolor}
\usepackage[top=2.5cm,bottom=5cm]{geometry}

% Table                                       
\usepackage{booktabs}
\usepackage{tabularx}
\usepackage{multirow}
\usepackage{pdflscape}
\usepackage{adjustbox}
\usepackage{lscape}
\usepackage{longtable}
\usepackage{tabulary}
\usepackage{colortbl}
\usepackage[font=normalsize,labelfont={bf}]{caption}
\captionsetup{justification=raggedright,singlelinecheck=false}
\usepackage{dcolumn}
\usepackage{parskip}
\usepackage{scrextend}
\usepackage{lscape}
\usepackage{easyReview}
\usepackage{array}
\usepackage{authblk}
%\newcolumntype{H}{>{\setbox0=\hbox\bgroup}c<{\egroup}@{}}
\usepackage{adjustbox}
\usepackage{ragged2e}

相关内容