diff options
Diffstat (limited to 'macros/latex/contrib/ddphonism/ddphonism.sty')
-rw-r--r-- | macros/latex/contrib/ddphonism/ddphonism.sty | 456 |
1 files changed, 135 insertions, 321 deletions
diff --git a/macros/latex/contrib/ddphonism/ddphonism.sty b/macros/latex/contrib/ddphonism/ddphonism.sty index 4ae54d3e63..76f3e028ce 100644 --- a/macros/latex/contrib/ddphonism/ddphonism.sty +++ b/macros/latex/contrib/ddphonism/ddphonism.sty @@ -5,12 +5,12 @@ %% This program can be redistributed and/or modified under the terms %% of the LaTeX Project Public License Distributed from CTAN archives %% in directory macros/latex/base/lppl.txt. - + \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{ddphonism} -[2019/09/01 v0.2 Dodecaphonic diagrams: twelve-tone matrices, clock diagrams, etc.] +[2019/08/10 v0.1 LaTeX package for twelve-tone matrices, clock diagrams et al.] -\RequirePackage{etoolbox} +\RequirePackage{ifthen} \RequirePackage{xparse} \RequirePackage{tikz} \RequirePackage{xstring} @@ -26,131 +26,41 @@ \DeclareExpandableDocumentCommand{\Evaluation}{m}{\int_eval:n {#1}} \ExplSyntaxOff -\newcounter{Dsize} -\newcommand{\DsizeMake}[1]{% - \setcounter{Dsize}{0}% - \foreach \n in {#1}{% - \stepcounter{Dsize}% - }% -} - -% Only with numbers. \newcounter{Dfirst} -\newcommand{\DheadMake}[1]{% - \setcounter{Dfirst}{-1}% - \foreach \n in {#1}{% - \ifnum\theDfirst=-1% - \setcounter{Dfirst}{\n}% - \fi% - }% -} - -% Only when DsizeMake is already done. -\newcounter{Dmod} -\newcommand{\Modulo}[1]{% - \setcounter{Dmod}{#1}% - \loop% - \ifnum\theDmod>\Evaluation{\theDsize-1}% - \setcounter{Dmod}{\Evaluation{\theDmod-\theDsize}}% - \repeat% - \ifnum\theDmod<0% - \setcounter{Dmod}{\Evaluation{\theDmod+\theDsize}}% - \repeat% - \theDmod% -} +\newcounter{Dsize} -\newif\ifdmatrixLines -\newif\ifdmatrixOutside -\newif\ifdmatrixInside -\newif\ifdmatrixV -\newif\ifdmatrixH -\newif\ifdmatrixTikz -\pgfkeys{ - /dmatrix/.is family - , /dmatrix - , default/.style = - { lines = false - , outside lines = false - , inside lines = false - , sep = 1 - , vsep = 1 - , hsep = 1 - , no tikz = false +\newcommand{\DsizeHead}[1]{ + \setcounter{Dsize}{0} + \setcounter{Dfirst}{-1} + + \foreach \n in {#1}{ + \ifnum\theDfirst=-1 + \setcounter{Dfirst}{\n} + \fi + \stepcounter{Dsize} } - , no tikz/.is if=dmatrixTikz - , lines/.is if=dmatrixLines - , outside lines/.is if=dmatrixOutside - , inside lines/.is if=dmatrixInside - , vlines/.is if=dmatrixV - , hlines/.is if=dmatrixH - , sep/.estore in=\dmatrixSep - , vsep/.estore in=\dmatrixVsep - , hsep/.estore in=\dmatrixHsep } -\newcommand{\DLOH}{% - \draw (0.05*\dmatrixSep*\dmatrixHsep,0) --% - (\theDsize*\dmatrixSep*\dmatrixHsep+0.05*\dmatrixSep*\dmatrixHsep,0);% - \draw (0.05*\dmatrixSep*\dmatrixHsep,-\theDsize*0.5*\dmatrixSep*\dmatrixVsep) -- % - (\theDsize*\dmatrixSep*\dmatrixHsep+0.05*\dmatrixSep*\dmatrixHsep,-\theDsize*0.5*\dmatrixSep*\dmatrixVsep);% +\newcommand{\Modulo}[1]{ + \ifnum#1>\Evaluation{\theDsize-1} + \Evaluation{#1-\theDsize} + \else\ifnum#1<0 + \Evaluation{#1+\theDsize} + \else #1 + \fi\fi } -\newcommand{\DLOV}{% - \draw (0.05*\dmatrixSep*\dmatrixHsep,0) -- % - (0.05*\dmatrixSep*\dmatrixHsep,-\theDsize*0.5*\dmatrixSep*\dmatrixVsep);% - \draw (\theDsize*\dmatrixSep*\dmatrixHsep+0.05*\dmatrixSep*\dmatrixHsep,0) -- % - (\theDsize*\dmatrixSep*\dmatrixHsep+0.05*\dmatrixSep*\dmatrixHsep,-\theDsize*0.5*\dmatrixSep*\dmatrixVsep); -} - -\newcommand{\DLIH}{% - \draw (0.05*\dmatrixSep*\dmatrixHsep,-\xD*0.5*\dmatrixSep*\dmatrixVsep) -- % - (\theDsize*\dmatrixSep*\dmatrixHsep+0.05*\dmatrixSep*\dmatrixHsep,-\xD*0.5*\dmatrixSep*\dmatrixVsep);% -} - -\newcommand{\DLIV}{% - \draw (\xD*\dmatrixSep*\dmatrixHsep+0.05*\dmatrixSep*\dmatrixHsep,0) -- % - (\xD*\dmatrixSep*\dmatrixHsep+0.05*\dmatrixSep*\dmatrixHsep,-\theDsize*0.5*\dmatrixSep*\dmatrixVsep);% -} - -\newcommand{\dmatrix}[2][]{% - \DsizeMake{#2}% - \DheadMake{#2}% - % - \pgfkeys{/dmatrix, default, #1}% - % - \ifdmatrixTikz\else% - \begin{tikzpicture}% - \fi% - \foreach [count=\nj] \j in {#2} {% - \foreach [count=\ni] \i in {#2} {% - \draw node at - ( \ni*\dmatrixSep*\dmatrixHsep-0.5*\dmatrixSep*\dmatrixHsep - , -\nj*\dmatrixSep*\dmatrixVsep/2+0.25*\dmatrixSep*\dmatrixVsep) {% - \Modulo{\Evaluation{\i-\j+\theDfirst}}% - };% - }% - }% - \foreach \xD in {1,...,\Evaluation{\theDsize-1}} {% - \ifdmatrixLines - \DLOH\DLOV\DLIH\DLIV - \fi - \ifdmatrixOutside - \DLOH\DLOV - \fi - \ifdmatrixInside - \DLIH\DLIV - \fi - \ifdmatrixH - \DLOH\DLIH - \fi - \ifdmatrixV - \DLOV\DLIV - \fi - }% - % - \ifdmatrixTikz\else% - \end{tikzpicture}% - \fi% +\newcommand{\dmatrix}[1]{ + \DsizeHead{#1} + \begin{tikzpicture} + \foreach [count=\nj] \j in {#1} { + \foreach [count=\ni] \i in {#1} { + \draw node at (\ni-0.5,-\nj/2+0.25) { + \Modulo{\Evaluation{\i-\j+\theDfirst}} + }; + } + } + \end{tikzpicture} } @@ -159,82 +69,45 @@ \usetikzlibrary{shapes,arrows,decorations.markings,shapes.misc} -\tikzstyle{ddiagram}=[minimum height=0pt,inner sep=0pt,outer sep=0pt,scale=0.65] - -\newif\ifddiagramTikz -\newif\ifddiagramNoNum -\newif\ifddiagramNoArr -\pgfkeys{ - /ddiagram/.is family - , /ddiagram - , default/.style = - { name =\empty% - , up =\empty% - , no tikz = false - , no numbers = false - , no arrow = false - , xshift = 0 - , yshift = 0 - , arrow shift = 2.5 - } - , no tikz/.is if=ddiagramTikz - , no numbers/.is if=ddiagramNoNum - , no arrow/.is if=ddiagramNoArr - , name/.estore in=\ddiagramName - , up/.estore in=\ddiagramUp - , xshift/.estore in=\ddiagramX - , yshift/.estore in=\ddiagramY - , arrow shift/.estore in=\ddiagramArrS -} - -\newcounter{Dprev} -\newcommand{\Dvar}{} -\newcommand{\ddiagram}[2][]{% - \DsizeMake{#2}% - \DheadMake{#2}% - % - \pgfkeys{/ddiagram, default, #1}% - % - \ifdefequal{\ddiagramUp}{\empty}% - {\renewcommand{\Dvar}{\theDfirst}}% if empty - {\renewcommand{\Dvar}{\ddiagramUp}}% if not empty - % - \ifddiagramTikz\else% - \begin{tikzpicture}[ddiagram,rotate=360*\Dvar/\theDsize]% - \fi% - \foreach \x in {0,...,\Evaluation{\theDsize-1}} {% - \ifddiagramNoNum\else - \node [xshift=\ddiagramX,yshift=\ddiagramY] at (90-360*\x/\theDsize:2) {\x};% - \fi - \node [xshift=\ddiagramX,yshift=\ddiagramY] (\x) at (90-360*\x/\theDsize:1.6) {};% - };% - % - \setcounter{Dprev}{-1}% - \foreach \x in {#2}{% - \ifnum \theDprev=\theDfirst% - \ifddiagramNoArr - \draw [xshift=\ddiagramX,yshift=\ddiagramY] (\theDprev) -- (\x);% - \else - \draw [xshift=\ddiagramX,yshift=\ddiagramY, - decoration= - {markings,mark=at position 0.099*\ddiagramArrS with +\tikzstyle ddiagramArrow=[decoration= + {markings,mark=at position 0.25 with {\arrow[scale=1.25,>=triangle 45]{>}}}, - postaction={decorate} - ] (\theDprev) -- (\x);% - \fi - \else \ifnum \theDprev=-1 \else% - \draw [xshift=\ddiagramX,yshift=\ddiagramY] (\theDprev) -- (\x);% - \fi\fi% - \setcounter{Dprev}{\x}% - };% - \draw [xshift=\ddiagramX,yshift=\ddiagramY] (\theDprev) -- (\theDfirst);% - % - \ifdefequal{\ddiagramName}{\empty}% - {}% if empty - {\node [xshift=\ddiagramX,yshift=\ddiagramY] at (0,0) [circle,fill=white] {\ddiagramName};}% if not empty - \ifddiagramTikz\else% - \end{tikzpicture}% - \fi% + postaction={decorate}] + +\newcounter{anterior} +\newcounter{var} +\newcommand{\ddiagram}[3][-1]{ + \DsizeHead{#2} + \def\theDDfirst{\Evaluation{\Modulo{\theDfirst}}} + + \ifnum #1=-1 + \setcounter{var}{\theDDfirst} + \else + \setcounter{var}{#1} + \fi + + \begin{tikzpicture}[rotate=360*\thevar/\theDsize, + minimum height=0pt,inner sep=0pt,outer sep=0pt,scale=0.65] + \foreach \x in {0,...,\Evaluation{\theDsize-1}} { + \node at (90-360*\x/\theDsize:2) {\x}; + \node (\x) at (90-360*\x/\theDsize:1.6) {}; + }; + + \setcounter{anterior}{-1} + \foreach \xD in {#2}{ + \def\x{\Evaluation{\Modulo{\xD}}} + \ifnum \theanterior=\theDDfirst + \draw [style=ddiagramArrow] (\theanterior) -- (\x); + \else \ifnum \theanterior=-1 + \else + \draw (\theanterior) -- (\x); + \fi\fi + \setcounter{anterior}{\x} + }; + \draw (\theanterior) -- (\theDDfirst); + + \node at (0,0) [circle,fill=white] {#3}; + \end{tikzpicture} } @@ -242,148 +115,89 @@ % Dihedral diagrams \tikzstyle ddihedralArrow=[decoration= -{markings,mark=at position 1 with {\arrow[scale=1.5,>=angle 60]{>}}}, -postaction={decorate}] + {markings,mark=at position 1 with {\arrow[scale=1.5,>=angle 60]{>}}}, + postaction={decorate}] -\tikzstyle{ddihedral}=[inner sep=0,minimum height=18pt] - -\newif\ifddihedralTikz -\newif\ifddihedralItalics \pgfkeys{ /ddihedral/.is family, /ddihedral, - default/.style = - { t = 0, c = 0, s = 0, v = 0 - , no tikz=false - , new t = T, new c = C, new s = S, new v = V - , no italics = false - }, - no tikz/.is if=ddihedralTikz, + default/.style = {t = 0, c = 0, s = 0, v = 0}, t/.estore in = \ddihedralT, c/.estore in = \ddihedralC, s/.estore in = \ddihedralS, v/.estore in = \ddihedralV, - no italics/.is if=ddihedralItalics, - new t/.estore in = \ddihedralNewT, - new c/.estore in = \ddihedralNewC, - new s/.estore in = \ddihedralNewS, - new v/.estore in = \ddihedralNewV, -} - -\newif\ifdarrowsTikz -\pgfkeys{ - /darrows/.is family, /darrows, - default/.style = {no tikz=false}, - no tikz/.is if=darrowsTikz, -} -\newcommand{\darrows}[2][]{% - \DsizeMake{#2}% - % - \pgfkeys{/darrows, default, #1}% - % - \ifdarrowsTikz\else% - \begin{tikzpicture}% - \fi% - \draw foreach \x in {0,...,\Evaluation{\theDsize-1}} {% - (90-360*\x/\theDsize:2.5) node[circle] (\x) {}% - };% - \foreach \x [count=\y] in {#2} {% - \draw [style=ddihedralArrow] (90-360*\Evaluation{\y-1}/\theDsize:1.25) -- (\x);% - };% - \ifdarrowsTikz\else% - \end{tikzpicture}% - \fi% } -\newcommand\ddihedral[2][]{% - \DsizeMake{#2}% - % - \pgfkeys{/ddihedral, default, #1}% - % - \ifddihedralTikz\else% - \begin{tikzpicture}[ddihedral]% - \fi% - \draw foreach \x in {0,...,\Evaluation{\theDsize-1}} {% - (\Evaluation{(90+\ddihedralT*360/\theDsize)+(2*\ddihedralS-1)*\x*360/\theDsize}:2.5)% - node[very thin,circle,draw] (\x) {\x}% - };% - % - \draw foreach \x in {0,...,\Evaluation{\theDsize-1}} {% - (\Evaluation{(90-\ddihedralC*360/\theDsize)+(2*\ddihedralV-1)*\x*360/\theDsize}:1.25)% - node[very thin,circle,draw] {\x}% - };% - % - \darrows[no tikz]{#2}% - % - \node at (0,0) [very thin,draw,circle, fill=white] {% - {\ifddihedralItalics\else\it\fi% - \ifodd\ddihedralV% - \ddihedralNewV\else% - \ifnum\ddihedralC=0% - \ifodd\ddihedralS\else% - \ifnum\ddihedralT=0% - \ddihedralNewT$^0$% - \fi\fi\fi\fi% - \ifnum\ddihedralC=0% - \else \ddihedralNewC$^{\ddihedralC}$\fi% - \ifodd\ddihedralS% - \ddihedralNewS\fi% - \ifnum\ddihedralT=0% - \else \ddihedralNewT$^{\ddihedralT}$\fi}% - };% - \ifddihedralTikz\else% - \end{tikzpicture}% - \fi% +\newcommand{\darrows}[1]{ + \DsizeHead{#1} + \draw foreach \x in {0,...,\Evaluation{\theDsize-1}} { + (90-360*\x/\theDsize:2.5) node[circle] (\x) {} + }; + \foreach \xD [count=\y] in {#1} { + \def\x{\Evaluation{\Modulo{\xD}}} + \draw [style=ddihedralArrow] (90-360*\Evaluation{\y-1}/\theDsize:1.25) -- (\x); + }; +} + +\newcommand\ddihedral[2][]{ + \pgfkeys{/ddihedral, default, #1} + + \tikzset{inner sep=0,minimum height=18pt} + + \DsizeHead{#2} + + \draw foreach \x in {0,...,\Evaluation{\theDsize-1}} { + (\Evaluation{(90+\ddihedralT*360/\theDsize)+(2*\ddihedralS-1)*\x*360/\theDsize}:2.5) + node[very thin,circle,draw] (\x) {\x} + }; + + \draw foreach \x in {0,...,\Evaluation{\theDsize-1}} { + (\Evaluation{(90-\ddihedralC*360/\theDsize)+(2*\ddihedralV-1)*\x*360/\theDsize}:1.25) + node[very thin,circle,draw] {\x} + }; + + \darrows{#2} + + \node at (0,0) [very thin,draw,circle, fill=white] {\ + \ifnum\ddihedralV=0 + \ifnum\ddihedralC=0 + \ifnum\ddihedralS=0 + \ifnum\ddihedralT=0 + P + \fi\fi\fi + \else V \fi + \ifnum\ddihedralC=0 + \else C$^{\ddihedralC}$ \fi + \ifnum\ddihedralS=0 + \else S \fi + \ifnum\ddihedralT=0 + \else T$^{\ddihedralT}$ \fi + \ }; } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Rows -\pgfkeys{ - /drow/.is family, /drow, - default/.style = {sep=\arraycolsep}, - sep/.estore in = \drowSep, -} - +\newcount\fooo \long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}} \newcounter{myDDcntr} -\newlength{\Dvarr} - -\newcommand{\drow}[2][]{% - \DsizeMake{#2}% - % - \pgfkeys{/drow, default, #1}% - \setlength{\Dvarr}{\arraycolsep} - \setlength{\arraycolsep}{\drowSep} - % - \ifnum\theDsize=0% - \ensuremath{\left(\right)}% - \else\ifnum\theDsize=1% - \ensuremath{% - \left(\begin{array}{*{\theDsize}c}% - 0\\% - #2\\% - \end{array}\right)% - }% - \else% - \def\TableDDdata{}% - \setcounter{myDDcntr}{0}% - \loop% - \addto\TableDDdata{\themyDDcntr\stepcounter{myDDcntr} &}% - \stepcounter{myDDcntr}% - \ifnum\themyDDcntr<\Evaluation{\theDsize-1}% - \repeat% - \addto\TableDDdata{\themyDDcntr \\}% - \setcounter{myDDcntr}{0}% - % - \ensuremath{% - \left(\begin{array}{*{\theDsize}c}% - \TableDDdata% - \StrSubstitute{#2}{,}{&}\\% - \end{array}\right)% - }% - \fi\fi% - \setlength{\arraycolsep}{\Dvarr} + +\newcommand{\drow}[1]{ + \DsizeHead{#1} + \def\tabledata{} \fooo=\theDsize + \setcounter{myDDcntr}{0} + \loop + \addto\tabledata{\themyDDcntr\stepcounter{myDDcntr} &} + \advance \fooo -1 + \ifnum \fooo>1 + \repeat + \addto\tabledata{\themyDDcntr \\} + \ensuremath{ + \left(\begin{array}{*{\theDsize}c} + \tabledata + \StrSubstitute{#1}{,}{&}\\ + \end{array}\right) + } } \endinput |