Die Fehlermeldung ist einer der typischen beim *Zerbrechen* eines Befehls bei der Expansion. In der Tat hilft es hier auch, den Befehl `\mathds` robust zu deklarieren.
\documentclass[12pt]{beamer}
\usepackage{libertine}
\usepackage[libertine,liby,slantedGreek]{newtxmath}
\usepackage{dsfont}
\usepackage{etoolbox,letltxmacro}
%\show\mathds
\LetLtxMacro\savedmathds\mathds
\newcommand*\vdssets{}
\forcsvlist{\listadd\vdssets}{N,Q,R}
\DeclareRobustCommand*\mathds[1]{%
\ifinlist{#1}{\vdssets}
{\savedmathds{#1}\relax}
{#1}%
}
\begin{document}
\[
%\expandafter\show\csname mathds \endcsname
1\in \mathds{N} \subset \mathds{Z} \subset \mathds{Q} \subset \mathds{R}
\]
\end{document}
Die robuste Deklaration ist auch deshalb sinnvoll, weil der Befehl zuvor bereits robust war, und erst durch die Umdefinierung mit `\renewcommand` zerbrechlich wird. Dass er robust war, kann man erkennen, wenn man die oben auskommentierte Zeile `\show\mathds` reaktiviert. Dann erhält man in der `log`-Datei die Ausgabe:
<pre>`> \mathds=macro:
->\protect \mathds .
l.7 \show\mathds`</pre>
Wann immer die `\show\foo` als Definition eines Makros `\protect \foo .` (man beachte die zwei Leerzeichen vor dem Punkt) ausgibt, handelt es sich um ein robust deklarierten Befehl.
Allerdings genügt in diesem Fall auch das nicht. `\mathds` wird nämlich als Mathe-Alphabeth deklariert. Das führt dazu, dass `\mathds` `\mathds ` (das innere mit dem Leerzeichen am Ende) erst mit dem Laden der Schrift endgültig definiert wird. Man sieht das, indem man die oben auskommentierte Zeile `\expandafter\show\csname mathds \endcsname` reaktiviert. Die Ausgabe zeigt dann nicht die erwartete neue Definition von `\mathds`, sondern `\select@group \mathds \M@U \U/dsrom/m/n`, eine typische Definition für ein Mathe-Alphabet.
Wir müssen nun also zusätzlich dafür sorgen, dass die Umdefinierung erst dann aktiv wird, wenn die Schrift bereits geladen wurde. Die Schrift wird spätestens dann geladen, wenn sie das erste Mal verwendet wird. Um genau dafür zu sorgen, können wir beispielsweise mit `\savebox` eine Box definieren, die einen beliebigen `\mathds`-Aufruf enthält. Diese Box können wir danach wieder vergessen, also ist es sinnvoll eine der temporären Boxen von LaTeX dafür zu verwenden, beispielsweise `\@tempboxa`. Da das Schriftsystem von LaTeX außerdem aber erst innerhalb von `\begin{document}` endgültig initialisiert wird, ist es sinnvoll, diesen Vorgang mit `\AtBeginDocument` so lange zu verzögern. Es ergibt sich dann beispielsweise:
\documentclass[12pt]{beamer}
\usepackage{libertine}
\usepackage[libertine,liby,slantedGreek]{newtxmath}
\usepackage{dsfont}
\usepackage{etoolbox,letltxmacro}
% \show\mathds% Erkennung von \protect-Definition
% \expandafter\show\csname mathds \endcsname% Erkennung der eigentlichen Definition
\newcommand*\vdssets{}
\forcsvlist{\listadd\vdssets}{N,Q,R}
\makeatletter
\AtBeginDocument{% warten bis LaTeX das Font-System initialisiert hat
\sbox\@tempboxa{$\mathds{}$}% Schrift laden und damit \mathds endgültig definieren
\LetLtxMacro\savedmathds\mathds% Definition übernehmen
\DeclareRobustCommand*{\mathds}[1]{% neu (und erneut robust) definieren
\ifinlist{#1}{\vdssets}%
{\savedmathds{#1}}%
{#1}%
}
}
\makeatother
\begin{document}
\[
% \expandafter\show\csname mathds \endcsname% Erneute Erkennung der eigentlichen Definition
1\in \mathds{N} \subset \mathds{Z} \subset \mathds{Q} \subset \mathds{R}
\]
\end{document}
Das führt dann auch wie erwartet zu
![so geht es][1]
Tatsächlich würde es jetzt auf den ersten Blick sogar genügen, `\mathds` beim der Umdefinierung nicht robust zu definieren. Allerdings würde dabei dann `\mathds` beispielsweise beim Schreiben in die `toc`-Datei bis hinunter zu `\savedmathds` expandiert. Bei Veränderung der Liste in `\vdssets` würden diese Veränderungen also im Inhaltsverzeichnis nicht unmittelbar, sondern erst nach einem zusätzlichen LaTeX-Lauf beachtet. Schon das sollte Grund genug sein, wie im Beispiel die Umdefinierung robust vorzunehmen.
[1]: http://texwelt.de/wissen/upfiles/test52.png