Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Hilfe mit neuem Spalltentyp - Inhalt als Makroargument

9 views
Skip to first unread message

Martin Scharrer

unread,
Aug 11, 2009, 7:58:00 AM8/11/09
to
Hallo,

Ich versuche mittels dem 'array' Packet ein Spalltentyp
(\newcolumntype) zu definieren das mir ein Makro von dem 'tikz-timing'
packet for den Inhalt der Tabellenspalte einfuegt. Also anstatt in
eine Zelle manuell "\texttiming{A..X}" zu schreiben, moechte ich nur
"A...X" (oder meinetwegen "{A..X}") schreiben muessen.

Alle meine Versuche mittels \bgroup/\egroup etc. scheitern soweit.
Kann mir jemand erklaeren wie/ob das genau geht? Mir sind die
Innereien von tabular nicht gelaeufig, weis also nicht wie genau der
Inhalt von ">{ }" eingefuegt wird.

Hier mein (nicht funktionierender) Code. \texttiming liest seine
Argument tokenweise ein.

\documentclass{article}

\usepackage{array}

% Either load read `\texttiming` macro or use minimal test
replacement:
\iftrue
\usepackage{tikz-timing}
\else
\newcommand{\texttiming}[2][]{'#1-#2'} % Test replacement
\fi

\begin{document}

% Manual
\begin{tabular}{ll}
Description & \texttiming{HLHL} \\
Description & \texttiming{LHLH} \\
\end{tabular}

% Using \bgroup / \egroup
\newcolumntype{T}{>{\texttiming\bgroup}l<{\egroup}}
\begin{tabular}{lT}
Description & HLHL \\
Description & LHLH \\
\end{tabular}

% With the { } in the column:
\newcolumntype{t}{>{\texttiming}l}
\begin{tabular}{lt}
Description & {HLHL} \\
Description & {LHLH} \\
\end{tabular}

\end{document}

Ulrike Fischer

unread,
Aug 11, 2009, 8:30:16 AM8/11/09
to
Am Tue, 11 Aug 2009 04:58:00 -0700 (PDT) schrieb Martin Scharrer:

> Hallo,
>
> Ich versuche mittels dem 'array' Packet ein Spalltentyp
> (\newcolumntype) zu definieren das mir ein Makro von dem 'tikz-timing'
> packet for den Inhalt der Tabellenspalte einfuegt. Also anstatt in
> eine Zelle manuell "\texttiming{A..X}" zu schreiben, moechte ich nur
> "A...X" (oder meinetwegen "{A..X}") schreiben muessen.
>
> Alle meine Versuche mittels \bgroup/\egroup etc. scheitern soweit.
> Kann mir jemand erklaeren wie/ob das genau geht? Mir sind die
> Innereien von tabular nicht gelaeufig, weis also nicht wie genau der
> Inhalt von ">{ }" eingefuegt wird.

\documentclass{article}

\usepackage{array}
\usepackage{tikz-timing}

\newcolumntype{T}{>{\scancell}l<{\endscan}}
\def\scancell#1\ignorespaces#2\unskip\endscan{%
\texttiming{#2}}

\begin{document}
\begin{tabular}{Tl}
HLHL&\\
\end{tabular}


\end{document}

Funktioniert nicht in der letzten Spalte der Tabelle!

--
Ulrike Fischer

Rolf Niepraschk

unread,
Aug 11, 2009, 8:36:45 AM8/11/09
to
Martin Scharrer schrieb:

> Hallo,
>
> Ich versuche mittels dem 'array' Packet ein Spalltentyp
> (\newcolumntype) zu definieren das mir ein Makro von dem 'tikz-timing'
> packet for den Inhalt der Tabellenspalte einfuegt. Also anstatt in
> eine Zelle manuell "\texttiming{A..X}" zu schreiben, moechte ich nur
> "A...X" (oder meinetwegen "{A..X}") schreiben muessen.
>
...
Hier eine Idee dazu:
%------------------------------------------------------------
\documentclass[fontsize=11pt,paper=a4,pagesize]{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{array,environ,graphicx}

\NewEnviron{collectC}{%
\mbox{}\scalebox{1}[-1]{\raisebox{-\height}{\BODY}}}

\newcolumntype{C}{>{\begin{collectC}}c<{\end{collectC}}}

\begin{document}
\bfseries
\begin{tabular}{|cCc|} \hline
U & V & W \\
\LaTeX & \LaTeX & \LaTeX \\
X & Y & Z \\ \hline
\end{tabular}
\end{document}
%------------------------------------------------------------
Für Deine Zwecke musst Du den zweiten Parameter des Makros "\NewEnviron"
geeignet anpassen. "\BODY" enthält den aktuellen Inhalt der C-Spalte.

...Rolf

Rolf Niepraschk

unread,
Aug 11, 2009, 8:48:55 AM8/11/09
to
Rolf Niepraschk schrieb:

> Martin Scharrer schrieb:
>> Hallo,
>>
>> Ich versuche mittels dem 'array' Packet ein Spalltentyp
>> (\newcolumntype) zu definieren das mir ein Makro von dem 'tikz-timing'
>> packet for den Inhalt der Tabellenspalte einfuegt. Also anstatt in
>> eine Zelle manuell "\texttiming{A..X}" zu schreiben, moechte ich nur
>> "A...X" (oder meinetwegen "{A..X}") schreiben muessen.
>>
> ...
> Hier eine Idee dazu:

Ich bemerke gerade, dass meine Variante auch in der letzten Spalte nicht
funktioniert ;-(

...Rolf

Martin

unread,
Aug 11, 2009, 9:19:56 AM8/11/09
to

Vielen Dank Ulrike,
das bringt mich schon mal auf den richtigen Weg. Habe schon ein paar
Gedanken darüber wie ich es auch
in der letzten Spalte zum laufen bekomme. Das \texttiming macro ruft
normalerweise ein internes Makro so auf: \tikztiming@parser #1\relax
Dieses Makro liest dann Token ein bis es auf \relax stoesst. Ich
koennte das so umaendern, dass es auch bei \unskip und \\ abbricht.

Hier ein Proof-of-Concept Minimalbeispiel. Das \ifendmarker Makro kann
man sicherlich noch optimieren.


\documentclass{article}

\usepackage{array}
\usepackage{tikz-timing}

\makeatletter
\newcolumntype{T}{>{\scancell}l}

\def\scancell#1\ignorespaces{%
\ifendmarker{}%
{\parser}
}
\def\ifendmarker#1#2{%
\@ifnextchar\relax
{#1}%
{\@ifnextchar\unskip
{#1}%
{\@ifnextchar\\
{#1}%
{#2}%
}%
}%
}
\def\parser#1{%
'#1'\space % Normalerweise werden hier die Logikzustaende
gezeichnet
\ifendmarker{}
{\parser}
}


\begin{document}
\begin{tabular}{TT}
HLHL& HLHL \\
dld & lld \\
\end{tabular}

\end{document}

Martin

unread,
Aug 11, 2009, 9:25:50 AM8/11/09
to

Danke Rolf,
man muesste einfach mal ein \collect@cell Makro programmieren,
aehnlich wie dem \collect@body (oder so) Makro das in \NewEnviron
Verwendung findet.
Dann kann man einfach schreiben ">{\collect@cell\mymacro}". Ich setzte
es mal auf meine TODO Liste.

Gruesse,
Martin

Martin

unread,
Aug 11, 2009, 11:17:15 AM8/11/09
to

Ich habe nun mal so ein \collect@cell Makro programmiert. Das Packet
nenne ich erst einmal 'collcell' (collect cell content).
Der Code und ein Minimalbeispiel ist auf 'http://latex.scharrer-
online.de/wiki/collcell'.

Mein uerspruengliches Problem kann man damit so loesen: "\newcolumntype
{T}{>{\collect@cell\texttiming}c}"

Die ueblichen Limitierungen fuer Makroargumente greifen wie immer, es
ist also kein Verbatim in der Zelle moeglich. Auch darf kein \\ oder
\unskip (oder ein gleichwertiges Macro ala \let\x\unskip) in der Zelle
vorkommen. Dies kann man aber einfach mit \cr bzw. \csname unskip
\endcsname oder \def\myunskip{\unskip} (vorher) und \myskip (in der
Zelle) umgehen. Es funktioniert mit verschachtelten Tabellen (tabular)
wenn die eingeschlossene Tabelle mit { } umschlossen wird.

Ich habe vor den Code am Wochenende zu kommentieren, zu verpacken
(DTX) und auf CTAN hochzuladen. Verschlaege fuer den finallen
Packetnamen sind herzlich willkommen.

Gruesse,
Martin

Philipp Stephani

unread,
Aug 11, 2009, 11:30:40 AM8/11/09
to
Martin schrieb:

> man muesste einfach mal ein \collect@cell Makro programmieren,

Das wurde schon viele Male gemacht, unter anderem von den verschiedenen
Einheiten-Paketen wie siunitx. Schau dir dazu einfach mal die Makros
\NC@rewrite@S, \si@tab@begin@S, \si@tab@gettok@S und Konsorten an.

--
Replace “READ-MY-SIG” by “tcalveu” to answer by mail.

Martin

unread,
Aug 11, 2009, 12:25:02 PM8/11/09
to
On Aug 11, 4:30 pm, Philipp Stephani <READ-MY-...@arcor.de> wrote:
> Martin schrieb:
>
> > man muesste einfach mal ein \collect@cell Makro programmieren,
>
> Das wurde schon viele Male gemacht, unter anderem von den verschiedenen
> Einheiten-Paketen wie siunitx. Schau dir dazu einfach mal die Makros
> \NC@rewrite@S, \si@tab@begin@S, \si@tab@gettok@S und Konsorten an.

Danke fuer den Hinweis. Ein Packet, dass ein solches Makro fuer andere
Packete zur Verfuegung stellt gibt es anscheinend aber noch nicht?
Ich werde mir mal die angegebenen Makros ansehen.

Gruesse,
Martin

0 new messages