Ich möchte den Befehl \mathbb in Abhängigkeit des Arguments umdefinieren:

\mathbb{N} ---> \vmathbb{N}

\mathbb{Q} ---> \vmathbb{Q}

usw.

Das ganze soll für eine gewisse Anzahl von Buchstaben erfolgen, z.B. für N, Q, R. Für alle anderen Buchstaben soll der Befehl so bleiben, wie er ist.

Ich kann leider kein lauffähiges Beispiel erstellen, deswegen als Pseudobeispiel:

Open in Online-Editor
\documentclass[12pt]{beamer}
\usepackage{libertine}
\usepackage[libertine,liby,slantedGreek]{newtxmath}
\usepackage{ifthen}

%%%% Pseudocode
\renewcommand{\mathbb}[1]{%
  if (#1 = N) or (#1 = Q) or (#1 = R) {\vmathbb{#1}}
  else {\mathbb{#1}}
  }

\begin{document}
\[1\in \mathbb{N} \subset \mathbb{Z}  \subset \mathbb{Q} \subset \mathbb{R}\]
\end{document}

Ergänzung der Frage:

Ich habe die Antwort von Henri genommen und möchte die Sache nun für \mathds statt \mathbb umsetzen:

Open in Online-Editor
\documentclass{article}
\usepackage{dsfont} % defines \mathds
\usepackage{letltxmacro}
\usepackage{xparse}

\ExplSyntaxOn

% Save the definition of \mathds
\LetLtxMacro \dsfont_mathds:n \mathds

% Redeclare \mathbb
\RenewDocumentCommand \mathds { m }
 {
  \str_case:nnTF { #1 }
   { % if #1 matches N,Q,R use \vmathbb
    { N } { }
    { Q } { }
    { R } { }
   }
   {
    #1 % hier soll nur der Buchstabe ohne Formatierung ausgegeben werden
   }
   { % else use saved \mathbb
    \dsfont_mathds:n { #1 }
   }
 }

\ExplSyntaxOff

\begin{document}
\[1\in \mathds{N} \subset \mathds{Z}  \subset \mathds{Q} \subset \mathds{R}\]
\end{document}

Das klappt. Wenn ich nun aber die letzte Zeile zweimal schreibe, kommt ein Fehler:

Use of reserved@a doesn't match its definition. [1in mathds{N} subset mathds{Z}

Open in Online-Editor
\documentclass{article}
\usepackage{dsfont} % defines \mathds
\usepackage{letltxmacro}
\usepackage{xparse}

\ExplSyntaxOn

% Save the definition of \mathds
\LetLtxMacro \dsfont_mathds:n \mathds

% Redeclare \mathbb
\RenewDocumentCommand \mathds { m }
 {
  \str_case:nnTF { #1 }
   { % if #1 matches N,Q,R use \vmathbb
    { N } { }
    { Q } { }
    { R } { }
   }
   {
    #1 % hier soll nur der Buchstabe ohne Formatierung ausgegeben werden
   }
   { % else use saved \mathbb
    \dsfont_mathds:n { #1 }
   }
 }

\ExplSyntaxOff

\begin{document}
\[1\in \mathds{N} \subset \mathds{Z}  \subset \mathds{Q} \subset \mathds{R}\]
\[1\in \mathds{N} \subset \mathds{Z}  \subset \mathds{Q} \subset \mathds{R}\]
\end{document}

gefragt 05 Mär '16, 08:50

tom75's gravatar image

tom75
2.2k187884
Akzeptiert-Rate: 57%

bearbeitet 05 Mär '16, 18:50

Zur Nachfrage: ersetze \RenewDocumentCommand \mathds { m } mit \DeclareRobustCommand*\mathds[1]. Es ist hier übrigens viel besser, statt eine Frage zu bearbeiten und damit nachträglich zu ändern und zu hoffen, dass Helfer das überhaupt bemerken, lieber eine neue Frage als Folgefrage zu stellen. Dort kann man ja auf die erste Frage verlinken, um den Kontext herzustellen.

(05 Mär '16, 19:02) cgnieder

Bevor ich die eigentliche Frage beantworte: ich würde \mathbb weder umdefinieren noch überhaupt direkt einsetzen. Ohne Umdefinition würde ich stattdessen einen Befehl \set definieren:

Open in Online-Editor
\newcommand*\set[1]{\mathbb{#1}}

und den dann konsequent einsetzen:

Open in Online-Editor
\[ 1\in \set{N} \subset \set{Z}  \subset \set{Q} \subset \set{R} \]

Vielleicht sogar:

Open in Online-Editor
\newcommand*\set[1]{\mathbb{#1}}
\newcommand*\N{\set{N}}
\newcommand*\Z{\set{Z}}
\newcommand*\Q{\set{Q}}
\newcommand*\R{\set{R}}

...

\[ 1\in \N \subset \Z  \subset \Q \subset \R \]

Mit dieser Vorüberlegung definiere ich nun einen Befehl \set, der auf N, Q und R testet und je nachdem \vmathbb oder \mathbb einsetzt. Dafür setze ich das Paket etoolbox ein:

Open in Online-Editor
\documentclass[12pt]{beamer}
\usepackage{libertine}
\usepackage[libertine,liby,slantedGreek]{newtxmath}
\usepackage{etoolbox}

\newcommand*\set[1]{%
  \ifboolexpr{
    test {\ifstrequal{#1}{N}} or
    test {\ifstrequal{#1}{Q}} or
    test {\ifstrequal{#1}{R}}
  }
  {\vmathbb{#1}}
  {\mathbb{#1}}%
}
\newcommand*\N{\set{N}}
\newcommand*\Z{\set{Z}}
\newcommand*\Q{\set{Q}}
\newcommand*\R{\set{R}}

\begin{document}

\[ 1\in \N \subset \Z  \subset \Q \subset \R \]

\end{document}

Eine bequemer erweiterbare Variante wäre, mit etoolbox' Listen zu arbeiten:

Open in Online-Editor
\documentclass[12pt]{beamer}
\usepackage{libertine}
\usepackage[libertine,liby,slantedGreek]{newtxmath}
\usepackage{etoolbox}

\newcommand*\vbbsets{}
\forcsvlist{\listadd\vbbsets}{N,Q,R}
\newcommand*\set[1]{%
  \ifinlist{#1}{\vbbsets}
    {\vmathbb{#1}}
    {\mathbb{#1}}%
}
\newcommand*\N{\set{N}}
\newcommand*\Z{\set{Z}}
\newcommand*\Q{\set{Q}}
\newcommand*\R{\set{R}}

\begin{document}

\[ 1\in \N \subset \Z  \subset \Q \subset \R \]

\end{document}

Falls es nicht anders geht, kann man die gleiche Methode wie in Henris Antwort anwenden:

Open in Online-Editor
\documentclass[12pt]{beamer}
\usepackage{libertine}
\usepackage[libertine,liby,slantedGreek]{newtxmath}
\usepackage{etoolbox,letltxmacro}

\LetLtxMacro\savedmathbb\mathbb

\newcommand*\vbbsets{}
\forcsvlist{\listadd\vbbsets}{N,Q,R}
\renewcommand*\mathbb[1]{%
  \ifinlist{#1}{\vbbsets}
    {\vmathbb{#1}}
    {\savedmathbb{#1}}%
}
\newcommand*\N{\mathbb{N}}
\newcommand*\Z{\mathbb{Z}}
\newcommand*\Q{\mathbb{Q}}
\newcommand*\R{\mathbb{R}}

\begin{document}

\[ 1\in \N \subset \Z  \subset \Q \subset \R \]

\end{document}
Permanenter link

beantwortet 05 Mär '16, 14:27

cgnieder's gravatar image

cgnieder
22.1k243463
Akzeptiert-Rate: 60%

bearbeitet 05 Mär '16, 18:57

Diese Lösung ist gut, aber leider kann ich sie nicht anwenden. Ich habe eine TeX-Datei, die \mathbb und \mathds für alle möglichen Mengen verwendet und ich kann sie nicht ändern. Ich möchte sie nur patchen, so dass die beiden Befehle nur für N,Z,Q,R,C verwendet werden, nicht aber für A,B,D, usw.

(05 Mär '16, 18:39) tom75

@tom75 Da bist Du prompt auf das Problem gestoßen, das man bekommt/bekommen kann, wenn man sich keine semantischen Befehle (im Beispiel \set) definiert und verwendet. Es ist gerade eine der Stärken von LaTeX, dass man im Nachhinein alles ganz schnell ändern kann, wenn man Dinge wie \mathbb oder auch \textit und \textbf nur in der Präambel in Befehlen einsetzt, und nie nach \begin{document}. (Bei mir geht das so weit, dass ich zum Teil Befehle definiere und verwende, die gar nichts machen (\newcommand*\stichwort[1]{#1}), die ich aber bei Bedarf einfach ändern kann.)

(05 Mär '16, 18:44) cgnieder

@tom75 anderseits sollte es eine Sache von höchstens einer Minute sein, mit dem Editor und dessen Search&Replace-Funktion alle \mathbb durch \set zu ersetzen und danach die obige Definition der Präambel hinzuzufügen.

(05 Mär '16, 18:50) cgnieder

@Clemens: Natürlich hast du Recht, und dein Hinweis ist gut, denn für meine eigenen Dokumente kann ich das so umsetzen, wie du es vorschlägst.

Im konkreten Fall geht das nicht, da mir die entsprechende Datei nicht zur Änderung zur Verfügung steht. (Oder anders ausgedrückt, ich darf keinen Buchstaben in der Datei verändern.)

(05 Mär '16, 18:53) tom75

@tom75 Du kannst meine Antwort natürlich trotzdem verwenden, siehe den Edit, den ich gemacht habe.

(05 Mär '16, 19:03) cgnieder

@Clemens: Ich habe eine neue Frage zu dem Thema erstellt.

(05 Mär '16, 19:51) tom75
Ergebnis 5 von 6 show 1 more comments

Mit Hilfe von \str_case:nnTF aus expl3 kann man leicht Fallunterscheidungen programmieren, die sich auch leicht erweitern lassen.

Zunächst müssen wir die alte Definition von \mathbb sichern. Da \mathbb protected ist brauchen wir \LetLtxMacro aus dem gleichnamigen Paket letltxmacro.

Open in Online-Editor
\LetLtxMacro \amsmath_mathbb:n \mathbb

Dann können wir \mathbb neu definieren.

Open in Online-Editor
\RenewDocumentCommand \mathbb { m }
 {
  \str_case:nnTF { #1 }
   { % if #1 matches N,Q,R use \vmathbb
    { N } { }
    { Q } { }
    { R } { }
   }
   {
    \vmathbb { #1 }
   }
   { % else use saved \mathbb
    \amsmath_mathbb:n { #1 }
   }
 }

Sollen noch weitere Buchstaben aus \vmathbb gesetzt werden, so genügt es eine weitere Zeile der Form { <Buchstabe> } { } einzufügen.

Ich hab aus deinem Beispiel mal alles entfernt, was für das Problem nicht wichtig ist.

Open in Online-Editor
\documentclass{article}
\usepackage{newtxmath} % defines \mathbb
\usepackage{letltxmacro}
\usepackage{xparse}

\ExplSyntaxOn

% Save the definition of \mathbb
\LetLtxMacro \amsmath_mathbb:n \mathbb

% Redeclare \mathbb
\RenewDocumentCommand \mathbb { m }
 {
  \str_case:nnTF { #1 }
   { % if #1 matches N,Q,R use \vmathbb
    { N } { }
    { Q } { }
    { R } { }
   }
   {
    \vmathbb { #1 }
   }
   { % else use saved \mathbb
    \amsmath_mathbb:n { #1 }
   }
 }

\ExplSyntaxOff

\begin{document}
\[1\in \mathbb{N} \subset \mathbb{Z}  \subset \mathbb{Q} \subset \mathbb{R}\]
\end{document}

alt text

Permanenter link

beantwortet 05 Mär '16, 11:16

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

Herzlichen Dank. Funktioniert das obige nur mit der Ersetzung von \mathbb durch \vmathbb?

Wie ist es, wenn ich nun andere Befehle ersetzen will, z.B. \mathds aus dem dsfont-Paket? Wie finde ich heraus, ob dieser Befehl protected ist?

(05 Mär '16, 11:28) tom75

@Tom: Das Prinzip ist immer dasselbe. Desweiteren: Lies die Anleitung zu letltxmacro. Lesen der halben Seite sollte die letzte Frage überflüssig machen. Und dann noch der Tipp: Ausprobieren!

(05 Mär '16, 13:36) saputello

@saputello: Ich hatte die Anleitung schon gelesen aber entweder nicht verstanden oder im mache etwas falsch. Ich ergänze meine obige Frage dahingehend.

In der Antwort von Henri ist mir auch die Notation \amsmath_mathbb:n nicht klar, z.B. was das :n bedeutet. Ich konnte inder Anleitung dazu nichts finden.

(05 Mär '16, 18:34) tom75

@tom75 Henry verwendet expl3, eine »Programmiersprache«, die in expl3, l3styleguide und interface3 beschrieben ist. Dort steht auch erklärt, was es mit dem Doppelpunkt und den nachfolgenden Zeichen auf sich hat.

(05 Mär '16, 18:47) cgnieder
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×20
×18
×14

gestellte Frage: 05 Mär '16, 08:50

Frage wurde gesehen: 8,157 Mal

zuletzt geändert: 05 Mär '16, 19:51