Anzeige:
Ergebnis 1 bis 4 von 4

Thema: Übergabe eines Befehls als ein optionales Argument

  1. #1
    Registrierter Benutzer
    Registriert seit
    15.04.2011
    Beiträge
    93

    Übergabe eines Befehls als ein optionales Argument

    Hallo,

    anbei ein kleinen Beispielcode von mir.

    Code:
    \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.

  2. #2
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.862
    Moin moin,
    Zitat Zitat von W2K2011 Beitrag anzeigen
    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:
    Code:
    \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
    Rainer
    There's nothing a good whack with a hammer won't fix!

  3. #3
    Registrierter Benutzer
    Registriert seit
    09.12.2005
    Beiträge
    1.327
    Oder:
    Code:
    \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[].

  4. #4
    Registrierter Benutzer
    Registriert seit
    15.04.2011
    Beiträge
    93
    super, ja vielen Dank. Die Lösung von klops funnktioniert sehr gut bei mir. Danke

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •