Seite 1 von 1

Beispiel xkeyval aus DTK 3/2011

Verfasst: Di 20. Dez 2011, 12:30
von Klaus
Hi,

ich habe mir das Beispiel zu Textboxen mit Hilfe des xkeyval Pakets (aus der texnischen Komödie 3/2011) zu Gemüte geführt.

Momentan sieht mein Code so aus:
\documentclass[a4paper,fontsize=11pt]{scrartcl}
% Packages
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{color}
\usepackage{xkeyval}
% new Commands
\newcommand*\TextColor{black}
\newcommand*\BackgroundColor{white}
\newcommand*\BorderColor{black}
\makeatletter
\define@choicekey{TextAlignment}{align}[\val\al]{right,left,center,block}{%
	\ifcase\al\relax \raggedleft%
		\or\raggedright%
		\or\centering%
		\or% Blocksatz
	\fi}	
\define@key{TextBox}{textcolor}{\renewcommand*\TextColor{#1}}
\define@key{TextBox}{background}{\renewcommand*\BackgroundColor{#1}}
\define@key{TextBox}{bordercolor}{\renewcommand*\BorderColor{#1}}
\define@key{TextBox}{border}{\setlength\fboxrule{#1}}
\define@key{TextBox}{bordersep}{\setlength\fboxsep{#1}}
\presetkeys{TextBox}{bordercolor=black,textcolor=black,background=white,%
border=0.8pt,bordersep=3pt}{}%
\presetkeys{TextAlignment}{align=block}{}%
\makeatother
\newcommand\framedtext[2][]{%
\begingroup%
\setkeys*{TextBox}{#1}%
\fcolorbox{\BorderColor}{\BackgroundColor}{%
\begin{minipage}{\linewidth-2\fboxsep-2\fboxrule}%
\setrmkeys{TextAlignment}%
\textcolor{\TextColor}{#2}%
\end{minipage}}%
\endgroup}%
\begin{document}
\framedtext[align=center]{%
Hello World!%
}
\end{document}
Wenn ich kompiliere, dann bekomme ich eine Box, in der Hello World zentriert ist, allerdings am linken Rand noch ein -2-2 steht. :shock:

Kommt das von der Definition der Minipage? Schließlich verwende ich dort zwei Mal -2. Aber ich kann mir nicht erklären was da passiert.

Gruß,
Klaus.

Verfasst: Di 20. Dez 2011, 12:33
von bloodworks
Füge noch ein
\usepackage{calc}
hinzu. Ich habe jetzt die DTK nicht zur Hand (was natürlich für eine pdf-Version sprechen würde, vll gehe ich doch nach Leipzig), deshalb kann ich dir nicht sagen, wie das im Beispiel gelöst wurde.

Ich finde das Beispiel so im Übrigen nicht so gut. Ohne \noindent vor dem Befehl ragt die Box über den Satzspiegel hinaus.
\usepackage{showframe}
zeigt das ganz gut.

Verfasst: Di 20. Dez 2011, 14:08
von Klaus
bloodworks hat geschrieben:Füge noch ein
\usepackage{calc}
hinzu.
Cool, das hat funktioniert! :shock: [1]

Warum?

bloodworks hat geschrieben: Ich finde das Beispiel so im Übrigen nicht so gut. Ohne \noindent vor dem Befehl ragt die Box über den Satzspiegel hinaus.
\usepackage{showframe}
zeigt das ganz gut.
Ich gestehe, dass ich das Beispiel dahingehend verändert habe, dass der Author seine documentclass mit der Option
parskip=half-
definiert hat. Das sollte die Box doch auch zum Positiven verändern, oder?

Gruß,
Klaus.

[1] Nun, dieser Kommentar rennt gerade bei mir offene Türen ein. So sehr wir LaTex Neulinge darauf getrimmt werden kompilierfähige Minimalbeispiele zu liefern, so fehlte erstmal die Angabe, dass 'xkeyval' und 'color' als Paket geladen werden sollen. Und jetzt scheinbar noch zusätzlich 'calc'? Das hat mich ein wenig geärgert. ;)

Verfasst: Di 20. Dez 2011, 14:17
von bloodworks
Klaus hat geschrieben:
Ich gestehe, dass ich das Beispiel dahingehend verändert habe, dass der Author seine documentclass mit der Option
parskip=half-
definiert hat. Das sollte die Box doch auch zum Positiven verändern, oder?
Ja bei dieser Option wird der parindet auf 0 gesetzt. Damit gibts es keinen Absatzeinzug. Das ist ein bisschen ein Trick, damit muss der Autor sich nicht um den Einzug kümmern muss.
Klaus hat geschrieben: [1] Nun, dieser Kommentar rennt gerade bei mir offene Türen ein. So sehr wir LaTex Neulinge darauf getrimmt werden kompilierfähige Minimalbeispiele zu liefern, so fehlte erstmal die Angabe, dass 'xkeyval' und 'color' als Paket geladen werden sollen. Und jetzt scheinbar noch zusätzlich 'calc'? Das hat mich ein wenig geärgert. ;)
Nun ja ich spreche mich sehr dafür aus, auch in der DTK komplette lauffähige Beispiele zu machen. Wenn du möchtest, kannst du das ja mal verifizieren (also ich für meinen Teil würde den Fehler erst mal bei mir vermuten) und dann den Autor darauf ansprechen. Entweder direkt oder in der dante mailing liste.

Grüße

Verfasst: Sa 7. Jan 2012, 14:30
von Klaus
Ich habe dazu nochmal eine Rückfrage.
Ich habe das obige Minimalbeispiel leicht modifiziert mit einem Satz vor und nach der Box:
\documentclass[a4paper,fontsize=11pt,ngerman]{scrartcl}
% Packages
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\usepackage{xkeyval}
\usepackage{calc}
% new Commands
\newcommand*\TextColor{black}
\newcommand*\BackgroundColor{white}
\newcommand*\BorderColor{black}
\makeatletter
\define@choicekey{TextAlignment}{align}[\val\al]{right,left,center,block}{%
   \ifcase\al\relax \raggedleft%
      \or\raggedright%
      \or\centering%
      \or% Blocksatz
   \fi}  
\define@key{TextBox}{textcolor}{\renewcommand*\TextColor{#1}}
\define@key{TextBox}{background}{\renewcommand*\BackgroundColor{#1}}
\define@key{TextBox}{bordercolor}{\renewcommand*\BorderColor{#1}}
\define@key{TextBox}{border}{\setlength\fboxrule{#1}}
\define@key{TextBox}{bordersep}{\setlength\fboxsep{#1}}
\presetkeys{TextBox}{bordercolor=black,textcolor=black,background=white,%
border=0.8pt,bordersep=3pt}{}%
\presetkeys{TextAlignment}{align=block}{}%
\makeatother
\newcommand\framedtext[2][]{%
\begingroup%
\setkeys*{TextBox}{#1}%
\fcolorbox{\BorderColor}{\BackgroundColor}{%
\begin{minipage}{\linewidth-2\fboxsep-2\fboxrule}%
\setrmkeys{TextAlignment}%
\textcolor{\TextColor}{#2}%
\end{minipage}}%
\endgroup}%
\begin{document}
Hier steht davor Text.
\framedtext[align=center]{%
Hello World!%
}
Und hier danach
\end{document}
Was mich jetzt wundert, dass die Box diret in der gleichen Zeile begonnen wird, wo der erste Satz aufhört.
Also scheinbar impliziert die minipage-Umgebung keinen automatischen Zeilenumbruch, wie ich es z.B. von Mathematikumgebungen (displaymath, equation, usw.) gewohnt bin?

Wie kann ich das denn zusätzlich einbauen?

Muss ich dann in der Definition der fcolorbox noch ein linebreak (oder ein vspace{} ) vor und nach der Minipageumgebung einbauen, z.B. so:
\fcolorbox{\BorderColor}{\BackgroundColor}{%
\linebreak
\begin{minipage}{\linewidth-2\fboxsep-2\fboxrule}%
\setrmkeys{TextAlignment}%
\textcolor{\TextColor}{#2}%
\end{minipage}%
\linebreak}%
Gruß,
Klaus.

Verfasst: Sa 7. Jan 2012, 14:34
von iTob
Da du ja nicht nur einen Zeilenumbuch sondern einen neuen Absatz willst, würde ich \par benutzen. Um die zusätzlichen Abstnde einzufügen empfielt sich \addvspace statt \vspace, weil ersteres den Leerraum nicht vergrößert, wenn bereit einer eingefügt wurde.
Um nach einer ggf. in einen (inhaltlichen) Absatz integrierten Minipage keinen Einzug zu bekommen, kannst du \noindent\ignorespacesafterend einfügen:

Hier nun der Code
\documentclass{scrartcl}

\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}

\makeatletter
\newenvironment{env}{%
	\par\addvspace{2\baselineskip}%
	\hspace*{2em}%
	\begin{minipage}{0.5\textwidth}%
}{%
	\end{minipage}%
	\par\addvspace{2\baselineskip}%
	\noindent\ignorespacesafterend%
}
\makeatother

\begin{document}
Das ein inhaltlicher Absatz davor (Fülltext Fülltext Fülltext Fülltext Fülltext
Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext
Fülltext Fülltext Fülltext Fülltext),
\begin{env}
--- Das ist die Minipage ---
\end{env}
der danach weitergeht (Fülltext Fülltext Fülltext Fülltext Fülltext
Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext
Fülltext Fülltext Fülltext Fülltext).

Neuer Absatz (Fülltext Fülltext Fülltext Fülltext Fülltext
Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext
Fülltext Fülltext Fülltext Fülltext) \dots
\begin{env}
--- Noch eine Minipage ---
\end{env}

Dieses mal beginnt danach aber ein neuer inhaltlicher Absatz (Fülltext
Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext
Fülltext Fülltext Fülltext Fülltext)

\begin{env}
--- Folgen zwei aufeinander, ---
\end{env}
\begin{env}
--- wird trotzdem nur einfacher Abstand eingefügt ---
\end{env}
\end{document}
Anmerkung: Das was ich zu \addvspace gesagt habe stimmt, wird hier aber blöderweise ausgehebelt. Ich muss mal schauen, ob ich da noch eine bessere Lösung finde.

PS: Der Status Rückfrage ist anders gedacht ;-)

Verfasst: Sa 7. Jan 2012, 15:28
von Klaus
Heißen Dank!

Damit muss ich gleich mal rumspielen und ausprobieren! :)
iTob hat geschrieben: PS: Der Status Rückfrage ist anders gedacht ;-)
Äh, wie dann?

Gruß,
Klaus.

Verfasst: Sa 7. Jan 2012, 16:05
von Sepp99
Klaus hat geschrieben:
iTob hat geschrieben: PS: Der Status Rückfrage ist anders gedacht ;-)
Äh, wie dann?
Siehe http://www.golatex.de/themen-mit-status ... t1872.html

Gruß, Sepp.-

Verfasst: Sa 7. Jan 2012, 17:15
von iTob
Hab’ die Lösung. Folgende Definition führt zum Ziel:
\makeatletter
\newenvironment{env}{%
	\par\addvspace{\baselineskip}%
	\hspace*{2em}%
	\begin{minipage}{0.5\textwidth}%
}{%
	\end{minipage}%
	\par\addvspace{\baselineskip}%
	\@endpetrue%
}
\makeatother
Habe auf TeX.SX gefragt und dort wusste es natürlich jemand :-)

Verfasst: Sa 7. Jan 2012, 17:41
von Klaus
Hi,
Alles klar! :)
iTob hat geschrieben: Hab’ die Lösung. Folgende Definition führt zum Ziel:
\makeatletter
\newenvironment{env}{%
	\par\addvspace{\baselineskip}%
	\hspace*{2em}%
	\begin{minipage}{0.5\textwidth}%
}{%
	\end{minipage}%
	\par\addvspace{\baselineskip}%
	\@endpetrue%
}
\makeatother
Habe auf TeX.SX gefragt und dort wusste es natürlich jemand :-)
Heißen Dank! Du bist der Beste. :)

Viele Grüße,
Klaus.