Übergeben komplizierter Argumentmuster an einen neuen Befehl

Übergeben komplizierter Argumentmuster an einen neuen Befehl

Ich verwende das Nice- changesPaket. Es bietet im Wesentlichen die drei Befehle \added, \deletedund \replaced. Aufgrund der Struktur und der Tatsache, dass es optionale Argumente verwendet, denke ich, dass es möglich ist, seine Verwendung zu vereinfachen. Ich habe die xparsePaketdokumentation befolgt, um zu sehen, ob ich einen Befehl erstellen kann, der den Aufruf vereinfacht.

Unten ist ein MWE. Ich konnte zwei Versionen des Befehls erstellen, eine diese deleteund eine diese, replaceabhängig von der Anzahl der Argumente. Aber mir ging schnell die Puste aus.

Zusammenfassend sind hier die Zuordnungen, die ich durch die Definition eines neuen Befehls erreichen möchte \ME:

  • \ME{deleted}Karten zu\deleted[id=Me]{deleted}
  • \ME[added]entspricht \added[id=Me]{added}(oder ist zumindest gleichwertig mit \ME[added]{})
  • \ME[replacing]{replaced}Karten zu\replaced[id=Me]{replacing}{replaced}
  • \ME[comment]{deleted}Karten zu\deleted[id=Me, remark={comment}]{deleted}
  • \ME[comment][added]wird abgebildet auf \added[id=Me,remark={comment}]{added}(oder entspricht \ME[comment][added]{})
  • \ME[comment][replacing]{replaced}Karten zu \replaced[id=Me, remark={comment}]{replacing}{replaced}.

MWE:

\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}

BEARBEITEN:Zusammenfassung bis hierhin. Dank @AxelBall und @ChristianHupfer habe ich diese Syntax erhalten, die (abgesehen von reinen Kommentaren) mit der folgenden Implementierung nahezu ideal ist:

\ME{addonly}

\ME{add}<deleted>

\ME<deleteonly>

\ME[addonlycommet]{addonly}

\ME[adddeletecomment]{add}<delete>

\ME[deleteonlycomment]<deleteonly>

text\ME[commentonly]

Und zum Schluss noch die Sternvarianten, die idbei der Überarbeitung dazukommen:

\ME*[deleteonlycomment]<deleteonly>

Code:

\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}}}}
}
}

Antwort1

Hier definieren wir einen Befehl \ME, der drei optionale Argumente annimmt:

\ME[optional comment]<deleted content>(added content)

<deleted>Es muss entweder und oder beides (added)angegeben werden, sonst bewirkt der Befehl nichts (es wird jedoch kein Fehler/keine Warnung ausgegeben).

(BEARBEITETum das Ersetzungsverhalten zu korrigieren.)

\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}

Ausgabe vom ersten Codebeispiel

Falls Sie Bedenken hinsichtlich der Verwendung von Klammern haben, können Sie beruhigt sein. xparseEs funktioniert einwandfrei, wenn Sie innerhalb des dritten Arguments ausgeglichene Klammern verwenden. Wenn Sie unausgewogene Klammern wünschen, schließen Sie diese in Klammern ein: \ME(like {(} this).

Wenn Sie für das letzte Argument wirklich Klammern verwenden möchten, können Sie den gSpezifizierer verwenden:

\NewDocumentCommand{\ME}{od<>g}{...}

BEARBEITEN

Okay, das hier sollte das gewünschte Ergebnis liefern:

\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}

Ausgabe:

Ausgabe aus dem zweiten Codebeispiel

Antwort2

Dabei werden tatsächlich drei optionale Argumente verwendet:

\ME[operation driver]<operation argument>[operation comment]

Jedes davon kann weggelassen werden, in diesem Fall würde nichts passieren.

\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}

verwandte Informationen