Probleme bei eigenem Macro

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Probleme bei eigenem Macro

von Gast » Di 9. Mai 2017, 15:32

Funktioniert perfekt, Danke.

von Gast » Di 9. Mai 2017, 14:53

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}

von Gast » Di 9. Mai 2017, 14:38

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?

von markusv » Di 9. Mai 2017, 14:08

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.

von Gast » Di 9. Mai 2017, 13:13

Danke!
hab es jetzt nach vielen Versuchen hinbekommen :D

von Gast » Di 9. Mai 2017, 10:44

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!

von Gast » Di 9. Mai 2017, 10:35

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?

von markusv » Di 9. Mai 2017, 10:12

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}

Probleme bei eigenem Macro

von Gast » Di 9. Mai 2017, 09:54

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.

Nach oben