Verwenden von \not zusammen mit benutzerdefinierten Befehlen

Verwenden von \not zusammen mit benutzerdefinierten Befehlen

Ich habe einen Befehl, einen Alias ​​eines komplexen Ausdrucks, den ich häufig verwende, und ich möchte ihn negieren, ohne einen neuen Alias ​​einzuführen.

Eine einfache Lösung führt das dritte Argument mit einem Standardwert ein, ist aber umständlich zu schreiben \myCommand[\neq]{arg1}{arg2}, etwas wie \not\myCommand{arg1}{arg2}ist viel besser.

Beispiel:

\newcommand{\divides}[2]{\ensuremath{#1\mid #2}}

danke für beide Antworten, jetzt weiß ich, wo ich nachhaken muss.

Antwort1

Ich schlage eine Syntax mit einer *-Variante anstelle des \notPräfixes vor.

\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{xparse}

\NewDocumentCommand{\newrelation}{mmo}{%
  % #1 is the command to define
  % #2 is the relation to be used
  % #3 (optional) is the alternative
  \IfNoValueTF{#3}
   {\NewDocumentCommand{#1}{smm}{%
     \IfBooleanTF{##1}{##2\not#2##3}{##2#2##3}%
    }%
   }
   {\NewDocumentCommand{#1}{smm}{%
     \IfBooleanTF{##1}{##2#3##3}{##2#2##3}%
    }%
   }%
 }

\newrelation{\EQ}{=}
\newrelation{\LESS}{<}
\newrelation{\divides}{\mid}[\nmid]

\begin{document}

$\EQ{a}{b}$ and $\EQ*{a}{b}$

$\LESS{a}{b}$ and $\LESS*{a}{b}$

$\divides{a}{b}$ and $\divides*{a}{b}$

\end{document}

Sagen \newrelation{\EQ}{=}ist gleichbedeutend mit Tippen

\NewDocumentCommand{\EQ}{smm}{%
   \IfBooleanTF{#1}% true if * is present
    {#2\not=#3}%
    {#2=#3}%
}

while \newrelation{\divides}{\mid}[\nmid]ist wie Tippen

\NewDocumentCommand{\divides}{smm}{%
   \IfBooleanTF{#1}% true if * is present
    {#2\nmid#3}%
    {#2\mid#3}%
}

Da beispielsweise \not\infalsch ist, könnten Sie

\newrelation{\IN}{\in}[\notin]

und die Ergebnisse werden entsprechend gesetzt. Gleichermaßen \not\midergibt ein schlechtes Ergebnis und \nmidsollte bevorzugt werden.

Bildbeschreibung hier eingeben

Wenn Sie lieber ein Präfix verwenden möchten, finden Sie es hier (dieselbe Ausgabe):

\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{xparse}

\NewDocumentCommand{\newrelation}{mmo}{%
  % #1 is the command to define
  % #2 is the relation to be used
  % #3 (optional) is the alternative
  \IfNoValueTF{#3}
   {%
    \NewDocumentCommand{#1}{mm}{##1#2##2}%
    \expandafter\NewDocumentCommand\csname negate\string#1\endcsname{mm}{##1\not#2##2}%
   }%
   {%
    \NewDocumentCommand{#1}{mm}{##1#2##2}%
    \expandafter\NewDocumentCommand\csname negate\string#1\endcsname{mm}{##1#3##2}%
   }%
 }

\makeatletter
\NewDocumentCommand{\negate}{m}{%
  \@ifundefined{negate\string#1}
    {\@latex@error{Undefined relation}{}#1}{\@nameuse{negate\string#1}}%
}
\makeatother

\newrelation{\EQ}{=}
\newrelation{\LESS}{<}
\newrelation{\divides}{\mid}[\nmid]

\begin{document}

$\EQ{a}{b}$ and $\negate\EQ{a}{b}$

$\LESS{a}{b}$ and $\negate\LESS{a}{b}$

$\divides{a}{b}$ and $\negate\divides{a}{b}$

\end{document}

Antwort2

Einrichten ist erforderlich, aber machbar. Im Wesentlichen müssen Sie verschiedene Makros definieren, die das gewünschte „A-Symbol B“ für verschiedene Symbole ausführen, und dann müssen Sie definieren, \negatewie jedes dieser Symbole nacheinander negiert wird.

\documentclass{article}
\usepackage{stackengine,xcolor,mathtools}
\def\eqsym{=}
\def\gtsymbol{>}
\let\svmid\mid
\let\svgtsymbol\gtsymbol
\newcommand{\divides}[2]{\ensuremath{#1\mid #2}}
\newcommand{\equals}[2]{\ensuremath{#1\eqsym #2}}
\newcommand\greaterthan[2]{\ensuremath{#1\gtsymbol #2}}
\newcommand\negate[1]{%
  \ifx\divides#1\def\mid{\mathrlap{\,/}\svmid}\else%
  \ifx\equals#1\let\eqsym\neq\else%
  \ifx\greaterthan#1\def\gtsymbol{\mathrlap{\,\,/}\svgtsymbol}\else%
  \fi\fi\fi%
  #1%
}
\begin{document}

$\divides{1}{2} \quad \negate\divides{1}{2}$

$\equals{1}{2} \quad \negate\equals{1}{2}$

$\greaterthan{1}{2} \quad \negate\greaterthan{1}{2}$


$\divides{1}{2} \quad \equals{1}{2} \quad \greaterthan{1}{2}$
\end{document}

Bildbeschreibung hier eingeben

NACHTRAG:

Eine Möglichkeit, die mögliche Einfachheit der Definitionen von egreg mit der Syntax meines Ansatzes zu kombinieren, wäre die Verwendung seines MWE mit der zusätzlichen Definition:

\def\negate#1{#1*}

Auf diese Art,

$\EQ{a}{b}$ and $\negate\EQ{a}{b}$

$\LESS{a}{b}$ and $\negate\LESS{a}{b}$

$\divides{a}{b}$ and $\negate\divides{a}{b}$

würde das gleiche Ergebnis wie sein MWE liefern.

verwandte Informationen