von iTob » So 6. Feb 2011, 14:02
Guten Morgen,
im Prinzip meinte ich das. Allerdings dachte ich, dass man den clip-Pfad auch gleichzeitig zeichnen kann. Das geht nur, wenn an keine zusätzlichen Optionen angeben will. Deine Lösung ist also die, die ich auch gefunden hätte.
Hier um ein paar Kommentare ergänzt:
\newcommand{\Sqrsl}[2]{\tikz[scale=0.65]{%
\clip (-.5em,-.5em) rectangle (.5em,.5em);% \clip = \path[clip]
\fill[fill=#1] (-2,-2) -- (-2,2) -- (2,2) -- cycle;%
\fill[fill=#2] (-2,-2) -- (2,2) -- (2,-2) -- cycle;%
% evtl eine Mittelachse?
\draw (-2,-2) -- (2,2);
\draw [line width=0.8pt,black] (-.5em,-.5em) rectangle (.5em,.5em);% \draw = \path [draw,...]
% ^ ^-- ist eh schwarz;
% | genauergesagt ist die Grundfarbe des Dokuments auch die Standardfarbe
% ---- das mit der Lininenbreite ist ein Problem beim clippen, weil genau auf der Mitte
% der gezeichneten Linine gschnitten wird, so dass sie hinterher nur noch halb so breit
% ist. Da gibt es aber zwei Lösungen
% 1. Man verdoppelt die Lininenbreite (also von stadarmäßigen 0.4pt="thin" auf 0.8pt="thick"
% hat dann aber das Problem, dass die Figur an sich auch etwas kleiner wird. (Hier verwendet)
% 2. Man erweitert den clip-Pfad gerade um die Hälfte der Linienbreite. Dazu scheint es aber keine
% Option zu geben, sodass man die Kooridnaten direkt bearbeiten muss.
% Einfacher scheint also Lösung 1, wenn man die kleinen ungenauigkeiten in Kauf nehemen kann/will.
}}
Wenn du die Form mit angeben willst, geht das auch, du musst sie nur abfragen. Hier eine Möglichkeit:
\documentclass{scrartcl}
\usepackage{lmodern}
\usepackage{tikz}
\usepackage{xstring}
\setlength\parindent{0pt}
\newcommand{\MyShape}[3][rh]{%
\tikz[scale=0.7]{
% 1. clip-Pfad wählen:
% 1.1 rectangle
\IfBeginWith{#1}{r}{\clip (-.5em,-.5em) rectangle (.5em,.5em);}{
% 1.2 diamond
\IfBeginWith{#1}{d}{\clip (0,-0.5em) -- (0.5em,0) -- (0,0.5em) -- (-0.5em,0) -- cycle;}{
% 1.3 circle
\IfBeginWith{#1}{c}{\clip circle (0.5em);}{
% 1.4 Unbekannte Form, Rechteck wählen
\clip (-.5em,-.5em) rectangle (.5em,.5em);
}}}
% 2. Farben zeichnen
% 2.1 horizontal
\IfEndWith{#1}{h}{
\fill [#2] (-1em,-1em) rectangle (0,1em);
\fill [#3] (0,-1em) rectangle (1em,1em);
\draw (0,-1em) -- (0,1em);
}{
% 2.2 vertikal
\IfEndWith{#1}{v}{
\fill [#2] (-1em,-1em) rectangle (1em,0);
\fill [#3] (-1em,0) rectangle (1em,1em);
\draw (-1em,0) -- (1em,0);
}{
% 2.3 diagonal von links nach rechts
\IfEndWith{#1}{dl}{
\fill [#2] (-1em,1em) -- (1em,-1em) -- (-1em,-1em) -- cycle;
\fill [#3] (-1em,1em) -- (1em,1em) -- (1em,-1em) -- cycle;
\draw (-1em,1em) -- (1em,-1em);
}{
% 2.4 diagonal von rechts nach links
\IfEndWith{#1}{dr}{
\fill [#2] (-1em,1em) -- (1em,1em) -- (-1em,-1em) -- cycle;
\fill [#3] (-1em,-1em) -- (1em,-1em) -- (1em,1em) -- cycle;
\draw (-1em,-1em) -- (1em,1em);
}{
% 2.5 unbekannte Teilung, wähle horizontal
\fill [#2] (-1em,-1em) rectangle (0,1em);
\fill [#3] (0,-1em) rectangle (1em,1em);
\draw (0,-1em) -- (0,1em);
}}}}
% 3. Rahmen zeichnen
% 3.1 rectangle
\IfBeginWith{#1}{r}{\draw [thick] (-.5em,-.5em) rectangle (.5em,.5em);}{
% 3.2 diamond
\IfBeginWith{#1}{d}{\draw [thick] (0,-0.5em) -- (0.5em,0) -- (0,0.5em) -- (-0.5em,0) -- cycle;}{
% 3.3 circle
\IfBeginWith{#1}{c}{\draw [thick] circle (0.5em);}{
% 3.4 Unbekannte Form, Rechteck wählen
\draw [thick] (-.5em,-.5em) rectangle (.5em,.5em);
}}}%
}%
}
\begin{document}
Syntax:
\verb|\MyShape[|$\langle$\textit{Form}$\rangle$\verb|-|$\langle$\textit{Teilung}$\rangle$\verb|]{|%
$\langle$\textit{Farbe1}$\rangle$\verb|}{|$\langle$\textit{Farbe2}$\rangle$\verb|}|
mit $\langle$\textit{Form}$\rangle\in$ [\texttt{r},\texttt{c},\texttt{d}] und
$\langle$\textit{Teilung}$\rangle\in$ [\texttt{h},\texttt{v},\texttt{dr},\texttt{dl}].
Wobei das \texttt{-} zwischen $\langle$\textit{Form}$\rangle$ und $\langle$\textit{Teilung}$\rangle$
auch weggelassen oder durch ein anderes Zeichen ersetzt werden könnte. Abgefragt wird nur,
womit das Argument beginnt und endet (s.\,u. bei Trennzeichen)
\bigskip
\texttt{[r-h]} = horizontal geteiltes Rechteck (ist Standard): \MyShape{blue}{green}
\texttt{[r-v]} = vertikal geteiltes Rechteck: \MyShape[r-v]{blue}{green}
\texttt{[r-dl]} = diagonal von links nach rechts geteiltes Rechteck: \MyShape[r-dl]{blue}{green}
\texttt{[r-dr]} = diagonal von links nach rechts geteiltes Rechteck: \MyShape[r-dr]{blue}{green}
\texttt{[d-h]} = horizontal geteilter Diamant: \MyShape[d-h]{blue}{green}
\texttt{[c-h]} = horizontal geteilter Kreis: \MyShape[c-h]{blue}{green}
\texttt{[x-h]} = unbekannte Form: \MyShape[x-h]{blue}{green}
\texttt{[c-x]} = unbekannte Teilung: \MyShape[c-x]{blue}{green}
\bigskip
Test: \foreach \form in {r,d,c}{\foreach \teil in {h,v,dl,dr} {\MyShape[\form-\teil]{blue}{green} }\quad}
\bigskip
Trennzeichen:
\texttt{[r-h]} (\MyShape[r-h]{green}{blue})
\foreach \trenner in {,+,?,x,.} {= \texttt{[r\trenner{}h]} (\MyShape[r\trenner{}h]{green}{blue}) }
\end{document}
Grüße,
Tobi
[Edit: zweiten Code verändert bzw. ergänzt]
Guten Morgen,
im Prinzip meinte ich das. Allerdings dachte ich, dass man den clip-Pfad auch gleichzeitig zeichnen kann. Das geht nur, wenn an keine zusätzlichen Optionen angeben will. Deine Lösung ist also die, die ich auch gefunden hätte.
Hier um ein paar Kommentare ergänzt:
[code]\newcommand{\Sqrsl}[2]{\tikz[scale=0.65]{%
\clip (-.5em,-.5em) rectangle (.5em,.5em);% \clip = \path[clip]
\fill[fill=#1] (-2,-2) -- (-2,2) -- (2,2) -- cycle;%
\fill[fill=#2] (-2,-2) -- (2,2) -- (2,-2) -- cycle;%
% evtl eine Mittelachse?
\draw (-2,-2) -- (2,2);
\draw [line width=0.8pt,black] (-.5em,-.5em) rectangle (.5em,.5em);% \draw = \path [draw,...]
% ^ ^-- ist eh schwarz;
% | genauergesagt ist die Grundfarbe des Dokuments auch die Standardfarbe
% ---- das mit der Lininenbreite ist ein Problem beim clippen, weil genau auf der Mitte
% der gezeichneten Linine gschnitten wird, so dass sie hinterher nur noch halb so breit
% ist. Da gibt es aber zwei Lösungen
% 1. Man verdoppelt die Lininenbreite (also von stadarmäßigen 0.4pt="thin" auf 0.8pt="thick"
% hat dann aber das Problem, dass die Figur an sich auch etwas kleiner wird. (Hier verwendet)
% 2. Man erweitert den clip-Pfad gerade um die Hälfte der Linienbreite. Dazu scheint es aber keine
% Option zu geben, sodass man die Kooridnaten direkt bearbeiten muss.
% Einfacher scheint also Lösung 1, wenn man die kleinen ungenauigkeiten in Kauf nehemen kann/will.
}} [/code]
Wenn du die Form mit angeben willst, geht das auch, du musst sie nur abfragen. Hier eine Möglichkeit:
[code]\documentclass{scrartcl}
\usepackage{lmodern}
\usepackage{tikz}
\usepackage{xstring}
\setlength\parindent{0pt}
\newcommand{\MyShape}[3][rh]{%
\tikz[scale=0.7]{
% 1. clip-Pfad wählen:
% 1.1 rectangle
\IfBeginWith{#1}{r}{\clip (-.5em,-.5em) rectangle (.5em,.5em);}{
% 1.2 diamond
\IfBeginWith{#1}{d}{\clip (0,-0.5em) -- (0.5em,0) -- (0,0.5em) -- (-0.5em,0) -- cycle;}{
% 1.3 circle
\IfBeginWith{#1}{c}{\clip circle (0.5em);}{
% 1.4 Unbekannte Form, Rechteck wählen
\clip (-.5em,-.5em) rectangle (.5em,.5em);
}}}
% 2. Farben zeichnen
% 2.1 horizontal
\IfEndWith{#1}{h}{
\fill [#2] (-1em,-1em) rectangle (0,1em);
\fill [#3] (0,-1em) rectangle (1em,1em);
\draw (0,-1em) -- (0,1em);
}{
% 2.2 vertikal
\IfEndWith{#1}{v}{
\fill [#2] (-1em,-1em) rectangle (1em,0);
\fill [#3] (-1em,0) rectangle (1em,1em);
\draw (-1em,0) -- (1em,0);
}{
% 2.3 diagonal von links nach rechts
\IfEndWith{#1}{dl}{
\fill [#2] (-1em,1em) -- (1em,-1em) -- (-1em,-1em) -- cycle;
\fill [#3] (-1em,1em) -- (1em,1em) -- (1em,-1em) -- cycle;
\draw (-1em,1em) -- (1em,-1em);
}{
% 2.4 diagonal von rechts nach links
\IfEndWith{#1}{dr}{
\fill [#2] (-1em,1em) -- (1em,1em) -- (-1em,-1em) -- cycle;
\fill [#3] (-1em,-1em) -- (1em,-1em) -- (1em,1em) -- cycle;
\draw (-1em,-1em) -- (1em,1em);
}{
% 2.5 unbekannte Teilung, wähle horizontal
\fill [#2] (-1em,-1em) rectangle (0,1em);
\fill [#3] (0,-1em) rectangle (1em,1em);
\draw (0,-1em) -- (0,1em);
}}}}
% 3. Rahmen zeichnen
% 3.1 rectangle
\IfBeginWith{#1}{r}{\draw [thick] (-.5em,-.5em) rectangle (.5em,.5em);}{
% 3.2 diamond
\IfBeginWith{#1}{d}{\draw [thick] (0,-0.5em) -- (0.5em,0) -- (0,0.5em) -- (-0.5em,0) -- cycle;}{
% 3.3 circle
\IfBeginWith{#1}{c}{\draw [thick] circle (0.5em);}{
% 3.4 Unbekannte Form, Rechteck wählen
\draw [thick] (-.5em,-.5em) rectangle (.5em,.5em);
}}}%
}%
}
\begin{document}
Syntax:
\verb|\MyShape[|$\langle$\textit{Form}$\rangle$\verb|-|$\langle$\textit{Teilung}$\rangle$\verb|]{|%
$\langle$\textit{Farbe1}$\rangle$\verb|}{|$\langle$\textit{Farbe2}$\rangle$\verb|}|
mit $\langle$\textit{Form}$\rangle\in$ [\texttt{r},\texttt{c},\texttt{d}] und
$\langle$\textit{Teilung}$\rangle\in$ [\texttt{h},\texttt{v},\texttt{dr},\texttt{dl}].
Wobei das \texttt{-} zwischen $\langle$\textit{Form}$\rangle$ und $\langle$\textit{Teilung}$\rangle$
auch weggelassen oder durch ein anderes Zeichen ersetzt werden könnte. Abgefragt wird nur,
womit das Argument beginnt und endet (s.\,u. bei Trennzeichen)
\bigskip
\texttt{[r-h]} = horizontal geteiltes Rechteck (ist Standard): \MyShape{blue}{green}
\texttt{[r-v]} = vertikal geteiltes Rechteck: \MyShape[r-v]{blue}{green}
\texttt{[r-dl]} = diagonal von links nach rechts geteiltes Rechteck: \MyShape[r-dl]{blue}{green}
\texttt{[r-dr]} = diagonal von links nach rechts geteiltes Rechteck: \MyShape[r-dr]{blue}{green}
\texttt{[d-h]} = horizontal geteilter Diamant: \MyShape[d-h]{blue}{green}
\texttt{[c-h]} = horizontal geteilter Kreis: \MyShape[c-h]{blue}{green}
\texttt{[x-h]} = unbekannte Form: \MyShape[x-h]{blue}{green}
\texttt{[c-x]} = unbekannte Teilung: \MyShape[c-x]{blue}{green}
\bigskip
Test: \foreach \form in {r,d,c}{\foreach \teil in {h,v,dl,dr} {\MyShape[\form-\teil]{blue}{green} }\quad}
\bigskip
Trennzeichen:
\texttt{[r-h]} (\MyShape[r-h]{green}{blue})
\foreach \trenner in {,+,?,x,.} {= \texttt{[r\trenner{}h]} (\MyShape[r\trenner{}h]{green}{blue}) }
\end{document}[/code]
Grüße,
Tobi
[Edit: zweiten Code verändert bzw. ergänzt]