Zeichen nach dem Befehl berücksichtigen

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


dknof
Forum-Anfänger
Forum-Anfänger
Beiträge: 48
Registriert: So 29. Jul 2012, 13:30

Zeichen nach dem Befehl berücksichtigen

Beitrag von dknof »

Hallo,

ich möchte per Makro ein Ergebnis abgesetzt in einer eigenen Zeile darstellen. Dabei habe ich die folgenden beiden Probleme:
1) Wenn hinter dem Argument ein Punkt oder ein Komma ist, soll es noch mit in derselben Zeile wie das Ergebnis ausgegeben werden. Da das Ergebnis fett dargestellt werden soll, das Satzzeichen aber nicht, kann ich es nicht in das Argument schreiben. Ich brauche also eine Möglichkeit, abhängig vom nächsten Zeichen dieses im Befehl zu berücksichtigen oder stehen zu lassen.
2) Nach dem Ergebnis soll ein Zeilenumbuch folgen, wenn der Absatz noch weitergeht. Dieses Problem kann ich zur Not manuell durch \\ an den entsprechenden Stellen umgehen.

In meinem Beispiel ist zu sehen, wie die Eingabe erfolgen soll und wie ich mir die Ausgabe vorstelle:
\documentclass{scrartcl}

\newcommand{\Ergebnis}[1]{\\\null\hfill\textbf{#1~EUR}\hfill}
%\newcommand{\Ergebnis}[1]{\\\null\hfill\textbf{#1~EUR}\hfill\\} % Underfull \hbox, wenn direkt anschließend der Absatz zuende ist

\begin{document}
\section{Eingabe}
Das erste Ergebnis ist \Ergebnis{111},
das zweite Ergebnis ist \Ergebnis{222}.

Das dritte Ergebnis ist: \Ergebnis{333}

\section{Soll-Ausgabe}
Das erste Ergebnis ist \\
\null\hfill\textbf{111~EUR},\hfill\null\\
das zweite Ergebnis ist \\
\null\hfill\textbf{222~EUR}.\hfill\null

Das dritte Ergebnis ist:\\
\null\hfill\textbf{333~EUR}\hfill\null

\end{document}
Danke schon einmal für die Ideen
Diether

Benutzeravatar
bloodworks
Moderator
Moderator
Beiträge: 1425
Registriert: Mo 19. Jan 2009, 10:52
Wohnort: /dev/null

Beitrag von bloodworks »

Zu 1: recht einfach (ich denke du kannst dir ausmalen was ifnextchar macht)
\documentclass{article} 
\usepackage[latin1]{inputenc} 

\usepackage[T1]{fontenc} 
\usepackage[ngerman]{babel} 
\makeatletter 
\newcommand{\Ergebnis}[1]{%
\@ifnextchar{.}{\hfill\textbf{#1~EUR}\hfill}{%
\@ifnextchar{,}{\null\hfill\textbf{#1~EUR}\hfill}{\\\null\hfill\textbf{#1~EUR}\hfill}}
}
\makeatother
\begin{document} 
Das erste Ergebnis ist \Ergebnis{111}, 
 das zweite Ergebnis ist \Ergebnis{222}.
Das dritte Ergebnis ist: \Ergebnis{333}


\end{document}
Zu 2: da fällt mir momentan nichts so einfaches ein, was nicht latex3 benötigen würde. Das würde ich dann aber noch nachlieferen, wenn mir noch was einfällt.
[1] Nützliche Webdokumente für Anfänger und Fortgeschrittene
[2]Minimalbeispiel | [3]FAQ
[4]Regelwerk | [5] Knigge
Wenn nicht anderst angegeben ist mein System: texlive 2012, pdflatex, x86-64, Snow Leopard utd.
Angehöriger der Liga zur Verwendung von texdoc
texdoc mathmode koma l2picfaq l2tabu lshort-en
Achtung: Aufforderungen ein Minimalbeispiel oder mehr Erklärungen zu einer Frage zu liefern sind keine persönlichen Angriffe. Sie dienen viel mehr dazu die Kommunikation zwischen Fragendem und potentiellen Helfern zu erleichtern und zu präzisieren.


dknof
Forum-Anfänger
Forum-Anfänger
Beiträge: 48
Registriert: So 29. Jul 2012, 13:30

Beitrag von dknof »

Hallo bloodworks,

den Befehl kannte ich bisher nicht, Danke für die schnelle Antwort. Leider wird der Punkt/das Komma aber immer noch nach dem Befehl mit ausgegeben, Ich habe \Ergebnis nun definiert mit
\makeatletter
\newcommand{\Ergebnis}[1]{%
\@ifnextchar{.}{\hfill\textbf{#1~EUR}.\hfill}{%
\@ifnextchar{,}{\null\hfill\textbf{#1~EUR},\hfill}{\\\null\hfill\textbf{#1~EUR}\hfill}}
}
\makeatother 
In der Ausgabe folgen nach 111 EUR aber zwei Kommas, eines aus der Definition und dann das aus dem Text. Gibt es so etwas wie \@skipnextchar?

Gruß
Diether

Benutzeravatar
bloodworks
Moderator
Moderator
Beiträge: 1425
Registriert: Mo 19. Jan 2009, 10:52
Wohnort: /dev/null

Beitrag von bloodworks »

Ok da wird das mit dem KOmma sichtbar denke ich. Habe also noch ne abfrage eingebaut ob der übernächste token n par ist....
\documentclass{article} 
\usepackage[latin1]{inputenc} 

\usepackage[T1]{fontenc} 
\usepackage[ngerman]{babel} 
\makeatletter 
\def\mstore{leer}
\def\mmake{
\ifx\mstore\par%
%
\else
\\
\fi
}
\newcommand{\Ergebnis}[1]{%
\@ifnextchar{.}{\hfill\textbf{#1~EUR}\hfill \futurelet\mstore\mmake%
}{%
\@ifnextchar{,}{\null\hfill\textbf{#1~EUR}\hfill \futurelet\mstore\mmake}{\\\null\hfill\textbf{#1~EUR}\hfill\futurelet\mstore\mmake}%
}%%
}
\makeatother
\begin{document} 
Das erste Ergebnis ist \Ergebnis{111}, 
 das zweite Ergebnis ist \Ergebnis{222}.
Das dritte Ergebnis ist: \Ergebnis{333}

b




\end{document}
Mit dem Kommaproblem muss ich mal nachdenken. Ich habe noch nie gesehen, dass TeX etwas vor dem Macro einsetzen kann...
[1] Nützliche Webdokumente für Anfänger und Fortgeschrittene
[2]Minimalbeispiel | [3]FAQ
[4]Regelwerk | [5] Knigge
Wenn nicht anderst angegeben ist mein System: texlive 2012, pdflatex, x86-64, Snow Leopard utd.
Angehöriger der Liga zur Verwendung von texdoc
texdoc mathmode koma l2picfaq l2tabu lshort-en
Achtung: Aufforderungen ein Minimalbeispiel oder mehr Erklärungen zu einer Frage zu liefern sind keine persönlichen Angriffe. Sie dienen viel mehr dazu die Kommunikation zwischen Fragendem und potentiellen Helfern zu erleichtern und zu präzisieren.


dknof
Forum-Anfänger
Forum-Anfänger
Beiträge: 48
Registriert: So 29. Jul 2012, 13:30

Beitrag von dknof »

Hallo bloodworks,

nun habe ich den folgenden Code:
\documentclass{scrartcl}

%\newcommand{\Ergebnis}[1]{\\\null\hfill\textbf{#1~EUR}\hfill}
%\newcommand{\Ergebnis}[1]{\\\null\hfill\textbf{#1~EUR}\hfill\\} % Underfull \hbox, wenn direkt anschließend der Absatz zuende ist
\makeatletter
\newcommand{\Ergebnis}[1]{%
\\\null\hfill\textbf{#1~EUR}%
\@ifnextchar{.}{.\hfill\null\@gobble}{%
\@ifnextchar{,}{,\hfill\null\@gobble}{%
\hfill\null}}}%
\makeatother 
\begin{document}
\section{Eingabe}
Das erste Ergebnis ist \Ergebnis{111},\\
das zweite Ergebnis ist \Ergebnis{222}.

Das dritte Ergebnis ist: \Ergebnis{333}

\section{Soll-Ausgabe}
Das erste Ergebnis ist \\
\null\hfill\textbf{111~EUR},\hfill\null\\
das zweite Ergebnis ist \\
\null\hfill\textbf{222~EUR}.\hfill\null

Das dritte Ergebnis ist:\\
\null\hfill\textbf{333~EUR}\hfill\null
\end{document}
Das \@gobble habe ich mir aus texdoc source2e geholt (Abschnitt 11.3). Übrigens wird bei dem Befehl \@ifstar ein dem Befehl folgender Stern ignoriert (Abschnitt 11.6):
\def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}}
Deine automatische Erkennung des folgenden Absatzes funktioniert nur bei einem manuellem Absatz, nicht bei einem folgenden \section oder \[ \]. Das reicht eigentlich aus, finde ich aber nicht so sauber. Außerdem habe ich nicht die Verbindung mit \@gobble hinbekommen, auch mit \@firstoftwo{\futurelet\mstore\mmake} kam ich an der Stelle nicht weiter (sollte das Komma ignorieren und den Absatz erkennen).

Danke für Deine Hilfe, mein Hauptproblem habe ich damit gelöst bekommen.

Diether

Antworten