Я использую changes
пакет nice. Который в основном предоставляет три команды \added
, \deleted
и \replaced
. Из-за структуры и того факта, что он принимает необязательные аргументы, я думаю, что его использование можно упростить. Я следовал xparse
документации пакета, чтобы посмотреть, смогу ли я создать команду, которая упрощает вызов.
Ниже представлен MWE. Мне удалось создать две версии команды, одну ту delete
и одну ту replace
в зависимости от количества аргументов. Но я быстро выдохся.
Подводя итог, вот сопоставления, которых я хотел бы добиться, определив новую команду \ME
:
\ME{deleted}
карты для\deleted[id=Me]{deleted}
\ME[added]
сопоставляется с\added[id=Me]{added}
(или по крайней мере эквивалентно\ME[added]{}
)\ME[replacing]{replaced}
карты для\replaced[id=Me]{replacing}{replaced}
\ME[comment]{deleted}
карты для\deleted[id=Me, remark={comment}]{deleted}
\ME[comment][added]
карты\added[id=Me,remark={comment}]{added}
(или эквивалент\ME[comment][added]{}
)\ME[comment][replacing]{replaced}
карты в\replaced[id=Me, remark={comment}]{replacing}{replaced}
.
МВЭ:
\documentclass{article}
\usepackage{changes}
\usepackage{xparse}
\definechangesauthor[name={MyName},color=blue]{ME}
\DeclareDocumentCommand \ME { o m }{%
\IfNoValueTF{#1}{
\deleted[id=ME]{#2}}{
\replaced[id=ME]{#1}{#2}
}
}
%\newcommand{\ME}[1]{\deleted[id=ME]{#1}} %ok
%\newcommand{\ME}[1][]{\added[id=ME]{#1}} % not working
\begin{document}
\added[id=ME,remark={added}]{added}
\deleted[id=ME,remark={deleted}]{deleted}
\replaced[id=ME,remark={replaced}]{replacing}{replaced}
\ME{aaa} % ok
\ME[aaa]{bbb} % ok
\ME[aaa]{} % ok
\ME{remark}[aaa]{}
\end{document}
РЕДАКТИРОВАТЬ:Резюме, пока. Благодаря @AxelBall и @ChristianHupfer я получил этот синтаксис, который почти идеален (за исключением чистых комментариев) с реализацией ниже:
\ME{addonly}
\ME{add}<deleted>
\ME<deleteonly>
\ME[addonlycommet]{addonly}
\ME[adddeletecomment]{add}<delete>
\ME[deleteonlycomment]<deleteonly>
text\ME[commentonly]
И, наконец, варианты со звездами, которые добавляются id
в редакцию:
\ME*[deleteonlycomment]<deleteonly>
код:
\NewDocumentCommand{\ME}{sogd<>}{
\IfBooleanTF#1{
\IfNoValueTF{#2}{\IfNoValueTF{#3}{\IfNoValueF{#4}{\deleted[id=ME]{#4}}}{\IfNoValueTF{#4}{\added[id=ME]{#3}}{\replaced[id=ME]{#3}{#4}}}}{\IfNoValueTF{#3}{\IfNoValueTF{#4}{\added[id=ME,remark={#2}]{}}{\deleted[id=ME, remark={#2}]{#4}}}{\IfNoValueTF{#4}{\added[id=ME,remark={#2}]{#3}}{\replaced[id=ME, remark={#2}]{#3}{#4}}}}
}{
\IfNoValueTF{#2}{\IfNoValueTF{#3}{\IfNoValueF{#4}{\deleted{#4}}}{\IfNoValueTF{#4}{\added{#3}}{\replaced{#3}{#4}}}}{\IfNoValueTF{#3}{\IfNoValueTF{#4}{\added[remark={#2}]{}}{\deleted[remark={#2}]{#4}}}{\IfNoValueTF{#4}{\added[remark={#2}]{#3}}{\replaced[remark={#2}]{#3}{#4}}}}
}
}
решение1
Здесь мы определяем команду \ME
, которая принимает три необязательных аргумента:
\ME[optional comment]<deleted content>(added content)
Необходимо указать один или оба параметра <deleted>
и (added)
, иначе команда не выполнит никаких действий (но ошибка/предупреждение не возникнет).
(РЕДАКТИРОВАНО(Чтобы исправить заменяющее поведение.)
\documentclass{standalone}
\usepackage{changes}
\usepackage{xparse}
\definechangesauthor[name={MyName},color=blue]{ME}
\NewDocumentCommand{\ME}{od<>d()}{%
\IfNoValueTF{#1}{%
\IfNoValueTF{#2}{%
\IfNoValueF{#3}{%
% (#3)
\added[id=ME]{#3}%
}%
}{%
\IfNoValueTF{#3}{%
% <#2>
\deleted[id=ME]{#2}%
}{% <#2>(#3)
\replaced[id=ME]{#3}{#2}%
}%
}%
}{%
\IfNoValueTF{#2}{%
\IfNoValueF{#3}{%
% [#1](#3)
\added[id=ME,remark={#1}]{#3}%
}%
}{%
\IfNoValueTF{#3}{%
% [#1]<#2>
\deleted[id=ME, remark={#1}]{#2}%
}{% [#1]<#2>(#3)
\replaced[id=ME, remark={#1}]{#3}{#2}%
}%
}%
}%
}
\begin{document}
\begin{tabular}{ll}
\deleted[id=ME]{deleted}
& \ME<deleted> \\
\added[id=ME]{added}
& \ME(added) \\
\replaced[id=ME]{replacing}{replaced}
& \ME<replaced>(replacing)\\
\deleted[id=ME, remark={comment}]{deleted}
& \ME[comment]<deleted> \\
\added[id=ME,remark={comment}]{added}
& \ME[comment](added)\\
\replaced[id=ME, remark={comment}]{replacing}{replaced}
& \ME[comment]<replaced>(replacing)\\
\end{tabular}
\end{document}
Если вас беспокоят скобки, не беспокойтесь. xparse
отлично справится, если вы используете сбалансированные скобки внутри третьего аргумента; если вам нужны несбалансированные, заключите их в фигурные скобки: \ME(like {(} this)
.
Если вы действительно хотите использовать фигурные скобки для последнего аргумента, вы можете использовать спецификатор g
:
\NewDocumentCommand{\ME}{od<>g}{...}
РЕДАКТИРОВАТЬ
Хорошо, это должно сделать то, что вам нужно:
\documentclass[border=12pt]{standalone}
\usepackage{changes}
\usepackage{xparse}
\definechangesauthor[name={MyName},color=blue]{ME}
\NewDocumentCommand{\ME}{ogd<>}{%
\IfNoValueTF{#1}{%
\IfNoValueTF{#2}{%
\IfNoValueF{#3}{%
% <#3>
\deleted[id=ME]{#3}%
}%
}{%
\IfNoValueTF{#3}{%
% {#2}
\added[id=ME]{#2}%
}{% {#2}<#3>
\replaced[id=ME]{#2}{#3}%
}%
}%
}{%
\IfNoValueTF{#2}{%
\IfNoValueTF{#3}{%
% [1]
\added[id=ME,remark={#1}]{}%
}{% [#1]<#3>
\deleted[id=ME, remark={#1}]{#3}%
}%
}{%
\IfNoValueTF{#3}{%
% [#1]{#2}
\added[id=ME,remark={#1}]{#2}%
}{% [#1]{#2}<#3>
\replaced[id=ME, remark={#1}]{#2}{#3}%
}%
}%
}%
}
\begin{document}
\begin{tabular}{ll}
\verb|\ME<deleted>|
& \ME<deleted> \\
\verb|\ME{added}|
& \ME{added} \\
\verb|\ME{added}<deleted>|
& \ME{added}<deleted>\\
\verb|\ME[comment]|
& \ME[comment]\\
\verb|\ME[comment]<deleted>|
& \ME[comment]<deleted> \\
\verb|\ME[comment]{added}|
& \ME[comment]{added}\\
\verb|\ME[comment]{added}<deleted>|
& \ME[comment]{added}<deleted>\\
\end{tabular}
\end{document}
Выход:
решение2
Фактически здесь используются три необязательных аргумента:
\ME[operation driver]<operation argument>[operation comment]
Любой из них можно опустить, в этом случае ничего не произойдет.
\documentclass{article}
\usepackage{changes}
\usepackage{xstring}
\usepackage{xparse}
\definechangesauthor[name={MyName},color=blue]{ME}
\DeclareDocumentCommand \MEOrig{ o m }{%
\IfNoValueTF{#1}{
\deleted[id=ME]{#2}}{
\replaced[id=ME]{#1}{#2}
}
}
\DeclareDocumentCommand{\ME}{oD<>{}o}{%
\IfNoValueTF{#1}{%
\IfValueTF{#3}{%
\deleted[id=ME,remark={#3}]{#2}%
}{%
\deleted[id=ME]{#2}%
}%
}{%
\IfStrEq{#1}{added}{%
\IfValueTF{#2}{%
\IfValueTF{#3}{%
\added[id=ME,remark={#3}]{#2}%
}{%
\added[id=ME]{#2}%
}%
}{%
\IfValueTF{#3}{%
\added[id=ME,remark={#3}]{}%
}{%
\added[id=ME]{}%
}%
}%
}{%
\IfStrEq{#1}{replacing}{%
\IfValueTF{#3}{%
\replaced[id=ME,remark={#3}]{replacing}{#2}%
}{%
\replaced[id=ME]{replacing}{#2}%
}%
}{%
% Do nothing in here
}%
}% End of IfStrEq{#1}{added}
}% End of IfNoValueTF{#1}
}
\begin{document}
\added[id=ME,remark={added}]{added}
\deleted[id=ME,remark={deleted}]{deleted}
\replaced[id=ME,remark={replaced}]{replacing}{replaced}
\ME<aaa> % ok
\ME[aaa]<bbb> % ok
\ME[aaa] % ok
\ME<remark>[aaa]
\end{document}