Seite 1 von 1

Zeichen nach dem Befehl berücksichtigen

Verfasst: Sa 19. Jan 2013, 21:08
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

Verfasst: Sa 19. Jan 2013, 22:17
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.

Verfasst: Sa 19. Jan 2013, 22:39
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

Verfasst: Sa 19. Jan 2013, 22:52
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...

Verfasst: So 20. Jan 2013, 15:27
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