我正在写一个同时使用变化(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.sty
是comment
将每个命令的原始界面暴露给我的包的消费者。
两个相互冲突的定义如下:
% 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
会导致冲突,因此人们可能有兴趣(并且能够)保留added
、replaced
和 等命令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}