PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Übergabe eines Befehls als ein optionales Argument



W2K2011
16-09-2013, 15:27
Hallo,

anbei ein kleinen Beispielcode von mir.



\documentclass[a4paper, % DINA4-Papier
%draft, % Bilder ausblenden, um schneller zu kompilieren
11pt, % Schriftgroesse
%parskip=half, % Absatzabstand 1.5
%listof=totoc, % Listen --> Inhaltsverzeichnis
%bibliography=totoc, % Literaturverz. -> Inhaltsverzeichnis
twoside] % Doppelseitig
{scrbook} % Dokumentenklasse
% ************************************************** ******************************
%\usepackage[headsep = 1.20\baselineskip, % Abstand - Trennline und dem Text
%headheight = 1.50\baselineskip, % Abstand -
%footskip = 1.25\baselineskip, % Abstand - Text (u.) zur Fusszeile
%footnotesep = 1.20\baselineskip, % Abstand - Text zur 1. Trennlinie (unten)
%top = 25mm, % Rand, oben
%bottom = 20mm, % Rand, unten
%left = 20mm, % Rand, links
%right = 20mm, % Rand, rechts
%bindingoffset= 05mm, % Offset für Bindung (links)
%includefoot %
%]{geometry} %

\usepackage[ngerman]{babel} % Neue dt. Rechtschreibung
\usepackage{array} %
\usepackage{amsmath}
\usepackage{ifthen} % Fallunterscheidungen
\usepackage{psfrag} %
\usepackage{pstricks} % Ausführliche Variante von
%
\newcommand{\Pt}[1][\empty]{
\ifthenelse{\equal{#1}{\empty}}
{P_\text{t}}
{P_{\text{t,#1}}}
}
% ************************************************** *************************************
\newcommand{\Ps}[1][\empty]{
\ifthenelse{\equal{#1}{\empty}}
{P_\text{s}}
{P_{\text{s,#1}}}
}
% ************************************************** *************************************
\newcommand{\PtMP}[1][\empty]{
\ifthenelse{\equal{#1}{\empty}}
{P_\text{t}}
{P_\text{t,\hspace{-0.025cm}\TFrame{#1}}}
}
% ************************************************** *************************************
\newcommand{\TFrame}[1]{%
\begin{pspicture}(0.0, 0.0)
\psframebox[framesep=1pt,
%boxsep=1pt,
linewidth=0.5pt,
linecolor=black,
fillstyle=solid]{#1}
\end{pspicture}%
}
% ************************************************** *************************************
\begin{document}
\begin{align}
\omega = \cfrac{\Pt[ein] - \Pt[aus]}{\Pt[3] - \Ps[3]}
\end{align}
Warum muss ich dies benutzen:
\begin{align}
\omega = \cfrac{\Pt[ein] - \Pt[aus]}{\PtMP[3M] - \Ps[3M]}
\end{align}
während folgendes nicht geht:
\begin{align}
\omega = \cfrac{\Pt[ein] - \Pt[aus]}{\Pt[\TFrame{3M}] - \Ps[3M]}
\end{align}
\end{document}

Ich habe mir den Befehl \Pt definiert, welcher ein optionales Argument besitzt. Ich suche nun nach einer Lösung, um dem Befehl den Parameter $\TFrame{3M}$ zu übergeben. In dem obigen Beispiel führt das zu 18 Fehlern. Was muss ich utn?

Danke im Voraus für die Hilfe.

rais
17-09-2013, 06:33
Moin moin,


Ich habe mir den Befehl \Pt definiert, welcher ein optionales Argument besitzt. Ich suche nun nach einer Lösung, um dem Befehl den Parameter $\TFrame{3M}$ zu übergeben. In dem obigen Beispiel führt das zu 18 Fehlern.
um Deinem Problem auf die Spur zu kommen, müsste man \ifthenelse und/oder \equal unter die Lupe nehmen.
Eine Alternative kann ich anbieten:


\documentclass{scrbook} % Dokumentenklasse
\usepackage[ngerman]{babel} % Neue dt. Rechtschreibung
\usepackage{amsmath}
\usepackage{ifthen} % Fallunterscheidungen
\usepackage{pstricks} % Ausführliche Variante von
%
\newcommand{\Pt}[1][\empty]{%
\ifthenelse{\equal{\detokenize{#1}}{\empty}}
{P_\text{t}}
{P_{\text{t,#1}}}%
}
\newcommand*\Ptii[1][]{%
\ifx\relax#1\relax
P_\text{t}%
\else
P_{\text{t,#1}}%
\fi
}
\newcommand{\TFrame}[1]{%
\begin{pspicture}(0.0, 0.0)
\psframebox[framesep=1pt,
%boxsep=1pt,
linewidth=0.5pt,
linecolor=black,
fillstyle=solid]{#1}
\end{pspicture}%
}
\begin{document}
\begin{align}
\omega = \cfrac{\Pt[ein] - \Pt[aus]}{\Pt[\TFrame{3M}] - \Pt}\\
\omega = \cfrac{\Ptii[ein] - \Ptii[aus]}{\Ptii[\TFrame{3M}] - \Ptii}
\end{align}
\end{document}

(der \detokenize sorgt hier nur dafür, daß \TFrame an \Pt übergeben werden kann, dummerweise schlägt damit der Vergleich auf \empty fehl)

MfG

klops
17-09-2013, 17:48
Oder:
\newcommand{\Pt}[1][]{%
\if\relax\detokenize{#1}\relax
P_\text{t}%
\else
\P_{\text{t,#1}}
\fi

Erklärung: Wenn #1 leer ist oder das optionale Argument von Anwender nicht verwendet wurde, dann bleibt bei der durch \if verursachten Expansion nur \relax und \relax übrig und beides sind Anweisungen, haben also den Zeichencode -1. Die beiden sind gleich und der Teil vor \else wird ausgeführt. Ist #1 irgend etwas anderes, dann bleibt \relax mit dem Zeichencode -1 und es bleiben aufgrund des \detokenize Zeichen der Kategorie other. Die alle, also auch das erste davon, einen Zeichencode >= 0 haben. Damit unterscheidet sich der Zeichencode des ersten davon von -1 und der Teil nach \else wird ausgeführt. Selbst wenn der Anwender \Pt[\relax] schreiben würde, wäre das also etwas anderes als \Pt oder \Pt[].

W2K2011
18-09-2013, 14:13
super, ja vielen Dank. Die Lösung von klops funnktioniert sehr gut bei mir. Danke