goLaTeX - Mein LaTeX-Forum

Mein LaTeX-Forum


Login  | Registrieren
Forum
      Option
[Erweitert]
  • Diese Seite weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Probleme bei eigenem Macro

 

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2017, 09:54     Titel: Probleme bei eigenem Macro
  Antworten mit Zitat      
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
Code • Öffne in Overleaf
\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}[b][c]

Ich hoffe ihr habt eine Idee.

markusv
Forum-Century
Forum-Century

Beiträge: 177
Anmeldedatum: 03.09.15
Wohnort: Leipzig
Version: ---
     Beitrag Verfasst am: 09.05.2017, 10:12     Titel:
  Antworten mit Zitat      
Moin,

das Latex3-Paket Paket auf CTANxparse bietet soetwas an.

Aus https://tex.stackexchange.com/quest.....l-argument-for-newcommand entstand folgendes Beispiel:

Code • Öffne in Overleaf
\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 Books heißen.

Unkomplizierte und schnelle LaTeX-Hilfe:
Help-LaTeX@web.de
Private Nachricht senden Benutzer-Profile anzeigen

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2017, 10:35     Titel:
  Antworten mit Zitat      
Perfekt Danke, genau das hab ich gesucht.

Jetzt hab ich nur noch ein Problem, Ich hab deinen Vorschlag angepasst und dabei dieses macro erstellt:

Code • Öffne in Overleaf
\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


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2017, 10:44     Titel:
  Antworten mit Zitat      
Lies die Dokumentationxparse-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 InfoMinimalbeispiel angeben sollte!

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2017, 13:13     Titel:
  Antworten mit Zitat      
Danke!
hab es jetzt nach vielen Versuchen hinbekommen Very Happy

markusv
Forum-Century
Forum-Century

Beiträge: 177
Anmeldedatum: 03.09.15
Wohnort: Leipzig
Version: ---
     Beitrag Verfasst am: 09.05.2017, 14:08     Titel:
  Antworten mit Zitat      
Anonymous hat Folgendes geschrieben:
Danke!
hab es jetzt nach vielen Versuchen hinbekommen Very Happy


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 Books heißen.

Unkomplizierte und schnelle LaTeX-Hilfe:
Help-LaTeX@web.de
Private Nachricht senden Benutzer-Profile anzeigen

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2017, 14:38     Titel:
  Antworten mit Zitat      
Mein Kommando sieht folgendermaßen aus:
Code • Öffne in Overleaf
\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:
Code • Öffne in Overleaf
\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


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2017, 14:53     Titel:
  Antworten mit Zitat      
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-break.....ilde) under expl3 syntax? Da brauchst Du dann wohl \nobreakspace.

Also
Code • Öffne in Overleaf
\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


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2017, 15:32     Titel:
  Antworten mit Zitat      
Funktioniert perfekt, Danke.

Neues Thema eröffnen Neue Antwort erstellen



Options and Permissions
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen
.

goLaTeX ist Teil der goForen
goForen.de goMATLAB.de goLaTeX.de goPCB.de


  Impressum | FAQ | goLaTeX RSS Button RSS-Feed

Copyright © 2008 - 2017 goLaTeX.de