Probleme bei eigenem Macro Thema ist als GELÖST markiert

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


Gast

Probleme bei eigenem Macro

Beitrag von Gast »

Guten morgen,

ich würde gerne ein Befehl definieren, der mit folgendes ausgibt:
a~b~c wobei mit ~ das Leerzeichen bei dem nicht umgebrochen werden soll gemeint ist.

Mit
\newcommand*{\Test}[3]{#1~#2~#3}
funktioniert das ganze auch ohne Probleme.

Jetzt aber zu meinem Problem. Ich hätte gerne, dass ich #2 und #3 Optional eingeben kann.
Mögliche Ausgaben wären dann:
a
a~b
a~b~c


Am liebsten würde ich die Argumente auch der Reihe nach eingeben, also \Test{a}[c]

Ich hoffe ihr habt eine Idee.

markusv
Forum-Meister
Forum-Meister
Beiträge: 947
Registriert: Do 3. Sep 2015, 17:20
Wohnort: Leipzig

Beitrag von markusv »

Moin,

das Latex3-Paket xparse bietet soetwas an.

Aus https://tex.stackexchange.com/questions ... newcommand entstand folgendes Beispiel:
\documentclass{article}
\usepackage{xparse}
\DeclareDocumentCommand{\Test}{m O{} O{}}{#1~#2~#3}

\begin{document}
  \Test{main}[option1(2)][option2(3)] 
  
  \Test{main}[option1(2)]
  
  \Test{onlymain}
\end{document}
Wäre Microsoft Word für das Schreiben von Büchern entwickelt worden,
würde es Microsoft Book heißen.

Unkomplizierte und schnelle LaTeX-Hilfe, bspw. Erstellung von Vorlagen und Bewerbungen:
Help-LaTeX@web.de

Gast

Beitrag von Gast »

Perfekt Danke, genau das hab ich gesucht.

Jetzt hab ich nur noch ein Problem, Ich hab deinen Vorschlag angepasst und dabei dieses macro erstellt:
\DeclareDocumentCommand{\Motor}{m m O{} O{} O{}}{#1~#2#3~#4 \SI{#5}{\volt}}
Wenn ich nun #5 nicht angebe gibt er mit trotzdem V aus. Vermutlich brauche ich zwei Ausgabevarianten, einmal wenn #5 angegeben ist und einmal ohne?

Gast

Beitrag von Gast »

Lies die [d]xparse[/d]-Anleitung. Darin ist erklärt, wie man testet, ob ein optionales Argument angegeben wurde oder nicht.

Liest außerdem Bedeutung des Status Rückfrage nach und halte dementsprechend den Status künftig wirklich aktuell.

Außerdem sei darauf hingewiesen, dass man im eigenen Interesse bei Fragen immer ein Minimalbeispiel angeben sollte!

Gast

Beitrag von Gast »

Danke!
hab es jetzt nach vielen Versuchen hinbekommen :D

markusv
Forum-Meister
Forum-Meister
Beiträge: 947
Registriert: Do 3. Sep 2015, 17:20
Wohnort: Leipzig

Beitrag von markusv »

Anonymous hat geschrieben:Danke!
hab es jetzt nach vielen Versuchen hinbekommen :D
Die Darstellung deiner Lösung in einem kleinen Beispiel wäre hier, vor allem für nachfolgende Suchende, sehr löblich.
Wäre Microsoft Word für das Schreiben von Büchern entwickelt worden,
würde es Microsoft Book heißen.

Unkomplizierte und schnelle LaTeX-Hilfe, bspw. Erstellung von Vorlagen und Bewerbungen:
Help-LaTeX@web.de

Gast

Beitrag von Gast »

Mein Kommando sieht folgendermaßen aus:
\DeclareDocumentCommand{\Motor}{m m O{} O{} o}
{\IfValueTF{#5}
	{#1~#2#3~#4 \SI{#5}{\volt}}
	{#1~#2#3~#4}
}
Dabei wird mit \IfValueTF abgefragt ob die Variable #5 angegeben wird.


Bei mir ist jetzt aber ein neues Problem aufgetreten.
Hierzu mal mein MB:
\documentclass[12pt]{article}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}      % Schriftart mit Umlauten
\usepackage[T1]{url}			% Schriftart mit Umlauten für ULRs
\usepackage[utf8]{inputenc} 	% Zeichenkodierung auf utf8

\usepackage{xparse}
\usepackage{siunitx}

\DeclareDocumentCommand{\Test}{m m o o o}
{
	\IfValueTF{#5}
	{test}
	{
		\IfValueTF{#4}
		{test}
		{
			\IfValueTF{#3}
			{test}
			{test}
		}
	}
}
\begin{document}
	Der Abstand nach dem Kommando ist unterschiedlich:\\
\Test{ein}{zwei}[drei][vier][fünf]...\\
\Test{ein}{zwei}[drei][vier]...\\
\Test{ein}{zwei}[drei]...\\
\Test{ein}{zwei}...\\
\end{document}
Um die ~ aus der oben genannten Lösung entfernen zu können, habe ich jede Eventualität abgefragt und die Ausgabe angepasst. Dabei ist mir aufgefallen, dass der Abstand nach der Ausgabe des Befehls unterschiedlich ist.
Um das Problem deutlich zu machen, habe ich die Ausgaben alle gleich (auf test) gesetzt. Jetzt sieht man deutlich das die drei Punkte nicht untereinander liegen.

Weiß jemand woran das liegen kann?

Gast

Beitrag von Gast »

In TeX sorgen Leerzeichen und Zeilenenden in Makrodefinitionen häufig zu (ungewolltem) Leerraum.

In LaTeX3 gibt es dazu \ExplSyntaxOn/\ExplSyntaxOff. Das ermöglicht neben der Nutzung von : und _ in Makronamen auch dafür, dass Leerzeichen unterdrückt werden: What do ExplSyntaxOn and ExplSyntaxOff do?

Becahte, dass damit ~ nur noch ein normales Leerzeichen ist und kein geschütztes mehr: How do I insert a tie (~, non-breaking space, tilde) under expl3 syntax? Da brauchst Du dann wohl \nobreakspace.

Also
\documentclass[12pt]{article}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}      % Schriftart mit Umlauten
\usepackage[T1]{url}         % Schriftart mit Umlauten für ULRs
\usepackage[utf8]{inputenc}    % Zeichenkodierung auf utf8

\usepackage{xparse}
\usepackage{siunitx}

\ExplSyntaxOn
\DeclareDocumentCommand{\Test}{m m o o o}
{
  \IfValueTF{#5}
    { test }
    {
      \IfValueTF{#4}
        { test }
        {
          \IfValueTF{#3}
            { test }
            { test }
        }
    }
}

\DeclareDocumentCommand{\Motor}{m m O{} O{} o}
{
  #1 \nobreakspace #2#3 \nobreakspace #4
  \IfValueT{#5}
    {~\SI{#5}{\volt}}
}
\ExplSyntaxOff

\begin{document}
   Der Abstand nach dem Kommando ist unterschiedlich:\\
\Test{ein}{zwei}[drei][vier][fünf]...\\
\Test{ein}{zwei}[drei][vier]...\\
\Test{ein}{zwei}[drei]...\\
\Test{ein}{zwei}...\\

\Motor{1}{2}[3][4][5]

\Motor{1}{2}[3][4]

\Motor{1}{2}[3]

\Motor{1}{2}
\end{document}

Gast

Beitrag von Gast »

Funktioniert perfekt, Danke.

Antworten