Seite 1 von 1

Variale als Array deklarieren

Verfasst: Mi 24. Jul 2013, 20:40
von Crys
Ich fange mit einem Beispiel an:
Ich habe einen Text, den ich öfters verwenden muss. Und zwar in verschiedenen Projekt an der selben Stelle, aber als anderer Text.
\newcommand{\meintext}{Hier steht ein längerer Text, den ich oft im Projekt einfügen müss}
Der Text ist aber so lang, dass ich den manchmal in mehrere Zeilen aufteilen muss. Aber an anderen Stellen in einem Stück einfügen will. Wenn ich den Text in mehrere Zeilen aufteile, dann ist es meist eine unterschiedliche Zeilenanzahl.
\newcommand{\meintextEins}{Hier steht ein längerer Text,}
\newcommand{\meintextZwei}{den ich oft im Projekt einfügen müss}

Hier mal ganz eingefügt:
\meintextEins~\meintextZwei

Hier in zwei Zeilen:
\meintextEins\\\meintextZwei
Wie oben dargestellt ist es sehr unpraktisch! Weil ich weiß ja nicht wie viele Teile ich habe.
Wieso kann ich eig keine Zahlen in Variablen verwenden?
\newcommand{\meintext}[1]{Hier steht ein längerer Text,}
\newcommand{\meintext}[2]{den ich oft im Projekt einfügen müss}

Hier mal ganz eingefügt:
\meintext

Hier in zwei Zeilen:
\meintext[1]\\\meintext[2]
Ich weiß das oben genannte geht nicht, aber versthet ihr was ich meine?
Wenn ich die Variable ohne Parameter ausgeben lasse, soll der ganze Text ausgegeben werden. Wenn ich die Variable mit Parameter ausgebe, dann soll nur der jeweilige Teil ausgegeben werden.

Wie kann ich da realisieren?

Verfasst: Mi 24. Jul 2013, 21:50
von esdd
Hallo,

ganz genau verstanden habe ich nicht, was du möchtest. Aber vielleicht hilft dir das Paket datatool:
\documentclass[parskip=half-]{scrartcl}

\usepackage{selinput}
\SelectInputMappings{adieresis={ä},germandbls={ß},Euro={€}}
\usepackage[ngerman]{babel}
\usepackage{microtype}

\usepackage{pgffor}
\usepackage{datatool}
\DTLnewdb{MeinText}
  \foreach \teiltext in {
    {Hier steht ein längerer Text,},
    {den ich oft im Projekt einfügen muss},
    {und nicht immer wieder schreiben möchte.}
  }{%
    \dtlexpandnewvalue
    \DTLnewrow{MeinText}
    \DTLnewdbentry{MeinText}{Inhalt}{\teiltext}
}

\makeatletter
\newcommand\meintext{\DTLforeach{MeinText}{\Inhalt@MeinText=Inhalt}{\Inhalt@MeinText\DTLiflastrow{}{ }}}
\newcommand\meinetextzeilen{\DTLforeach{MeinText}{\Inhalt@MeinText=Inhalt}{\Inhalt@MeinText\DTLiflastrow{}{\\}}}
\makeatother

\begin{document}

\meintext

\meinetextzeilen

\end{document}
Gruß
Elke

Verfasst: Do 25. Jul 2013, 09:28
von u_fischer
Wenn du den Text immer an den gleichen Stellen optional trennen willst, würde ich ja einfach ein optionales Argument nutzen:
\documentclass[parskip=half-]{scrartcl}
\newcommand{\meintext}[1][]{Hier steht ein längerer Text,#1 den ich oft im Projekt einfügen müss}

\begin{document} 
\meintext

\meintext[\\]

\end{document}

Verfasst: Do 25. Jul 2013, 09:57
von Noch so einer
Wenn Du die Breite der Ausgabe beschränkst, dann wird der Text automatisch entsprechend umbrochen:
\documentclass{article}
\usepackage{selinput}
\SelectInputMappings{
  adieresis={ä},
  germandbls={ß},
}
\usepackage{ragged2e}% für das Beispiel mit \RaggedRight
\newcommand*{\meintext}{Hier steht ein etwas längerer Text, den ich in diesem
  Projekt oft einfügen muss.}
\usepackage{parskip}% Nur aus Demo-Gründen

\begin{document}

\meintext

\parbox[tt]{.35\textwidth}{\strut\meintext\strut\par}

\parbox[tt]{.35\textwidth}{\raggedright\strut\meintext\strut\par}

\parbox[tt]{.35\textwidth}{\RaggedRight\strut\meintext\strut\par}

\end{document}
Für komplexere Szenarien sei auf das Paket xstring hingewiesen, das u. a. Strings zerteilen kann.

Verfasst: Do 25. Jul 2013, 17:10
von Crys
Danke euch!

Die Lösung von u_fischer ist die einfachste und genauso möchte ich es haben.
esdd, deins geht auch, nur ist ein klein bisschen komplexer ;)
Mit der Lösung vom Gast kann ich nichts anfangen, da ich keine feste Breite habe und an bestimmten Stellen im Text umbrechen möchte.

Verfasst: Do 25. Jul 2013, 18:56
von Crys
Wieso funktioniert das nicht:
\documentclass[parskip=half]{scrartcl}

\usepackage{selinput}
\SelectInputMappings{adieresis={ä},germandbls={ß},Euro={€}}
\usepackage[ngerman]{babel}

\newcommand{\meintext}[1][]{Hier steht ein längerer#1 Text, den ich oft im #1Projekt einfügen muss.}

\usepackage[
	pdftitle={\meintext}
]{hyperref}

\begin{document}

\meintext[\\]

\meintext

\end{document}
Den "pdftitle" kann ich nicht mit meiner Variable füttern.

Wenn ich die Variable so baue, wie in esdd's Beispiel, geht es auch nicht.

Verfasst: Do 25. Jul 2013, 19:21
von Genmutant
Es gibt da anscheinend ein Problem mit dem optionalen Parameter. Wenn er stattdessen nicht optional ist, geht es.
Geht nicht:
\documentclass[parskip=half]{scrartcl} 

\usepackage{selinput} 
\SelectInputMappings{adieresis={ä},germandbls={ß},Euro={€}} 
\usepackage[ngerman]{babel} 

\newcommand{\meintext}[1][]{b#1b}

\usepackage{hyperref}
\hypersetup{pdftitle={\meintext[a]}}

\begin{document}
\meintext[c]
\end{document}
Geht:
\documentclass[parskip=half]{scrartcl} 

\usepackage{selinput} 
\SelectInputMappings{adieresis={ä},germandbls={ß},Euro={€}} 
\usepackage[ngerman]{babel} 

\newcommand{\meintext}[1]{b#1b}

\usepackage{hyperref}
\hypersetup{pdftitle={\meintext{a}}}

\begin{document}
\meintext{c}
\end{document}
Du darfst den Titel übrigens erst im hypersetup setzen, nicht schon vorher (sagt die Anleitung).

Verfasst: Do 25. Jul 2013, 20:01
von Crys
¡Muchas gracias!
Das ist es Genmutant!

Verfasst: Do 25. Jul 2013, 20:20
von Genmutant
Es gibt sicher auch eine schöne, einfache Lösung für das optionale Parameter, aber ich hab auf die schnelle keine gefunden. Da dürften die erfahreren User aber was kennen vermute ich.

Verfasst: Do 25. Jul 2013, 22:45
von cgnieder
Genmutant hat geschrieben:Es gibt da anscheinend ein Problem mit dem optionalen Parameter. Wenn er stattdessen nicht optional ist, geht es.
Befehle mit optionalem Argument sind i.d.R. nicht expandierbar (in einem Expansionskontext), da sie vorausschauen müssen, ob eine eckige Klammer folgt. In einem solchen Fall entfernt hyperref den Befehl und lässt einen Hinweis im log:
Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref)                removing `\meintext' on input line 10.
Definiert man es mit verpflichtendem Argument, dann ist es expandibel (solange die Definition nichts Unexpandierbares enthält).

\documentclass{scrartcl}
\newcommand{\meintext}[1]{b#1b}
\usepackage{hyperref}
\hypersetup{pdftitle={\meintext{\\}}}
\begin{document}
\meintext{c}
\end{document}
liefert folgerichtig:
Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref)                removing `\\' on input line 4.
Der PDF-Titel ist hier »bb«

Grüße