7

T E Xでは、文字列など\mana{X1 2W/UB R /G}をパーツに分割し、それらを別のマクロにフィードして(この場合、マクロ呼び出しをのようなものに置き換える\m{X}\m{12}\m{W/U}\m{B}\m{R/G})、非常に単純なルールでグループ化する方法を教えてください。数字はグループを形成します。b)スラッシュは2つの近くの文字のグループを作成します。c)スペースは完全に削除されますか?

パッケージを試しましたsubstrが、あまり役に立ちませんでした。特定のサブストリングを見つけることしかできませんでした。のような手書きのループ

\def\lcpass#1.{}
\def\lcloop#1#2.{%
    \ifempty{#2}%
        #1%
        \let\continue=\lcpass%
    \else%
        \let\continue=\lcloop%
    \fi%
    \continue#2.}

\def\lastchar#1{\lcloop#1.} % returns the last character of a string

文字列が空白で終わると機能しません。どちらも。で成功しませんでした\futurelet

一般に、T E Xで文字列を解析するタスクにどのようにアプローチしますか?たとえば、このtexmateパッケージを使用すると、次のようなものを記述して|1 e4 e5 Nf3 Nc6|、対応するチェスの位置を自動的に描画できます。それはどのようにそれをしますか?文字列内の文字のループや、このような他のT E Xハックについて何を読むことができますか?

4

3 に答える 3

6
\def\m#1{\par$m$({\tt #1})}% Any macros
\def\removespaces{\catcode`\ =9 }% Ignore all spaces`

\let\manaNext\relax % aux def
\let\manaLastChar\relax % aux def
\newtoks\manaToks % aux toks
\newif\ifDigitProcessing

\def\mana#{\afterassignment \manaA \let\next= }% always next = {
\def\manaA{\bgroup \removespaces \let\manaNext\manaB \manaNext}% algorithm init: ignore spaces
\def\manaB{\futurelet\next\manaC}% algorithm start
\def\manaC{\ifx\next\egroup \def\nnext{\manaFlush\aftergroup\manaNext}\else\let\nnext\manaD\fi\nnext}% check for \egroup
\def\manaD{\ifx\next/\let\nnext\manaSlash\else \ifcat\next 1\let\nnext\manaDigit \else \let\nnext\manaE \fi\fi \nnext}% cases
\def\manaE#1{\manaFlush\DigitProcessingfalse\let\manaLastChar\next\manaNext}% Letters A-Z and a-z case
\def\manaFlush{\ifx\manaLastChar\relax\else\m{\manaLastChar}\fi\let\manaLastChar\relax
               \ifDigitProcessing\expandafter\m\expandafter{\the\manaToks}\fi\manaToks{}}% transform to \m{...}
\def\manaSlash#1#2{\m{\manaLastChar/#2}\let\manaLastChar\relax\manaNext}%#1=/, #2=next letter
\def\manaDigit#1{\ifDigitProcessing\else\manaFlush\fi
       \manaToks=\expandafter{\the\manaToks#1}\DigitProcessingtrue\manaNext}% 0-9 case

\hrule\medskip
\mana{X1 2W/UB R /G}
\medskip\hrule\medskip

\mana{X1 2W/UB s/SS 14 1 R /G XZ}
\medskip\hrule\medskip
于 2009-07-27T13:21:54.567 に答える
3

よくあることですが、適切な質問は解決策の半分です。上記の投稿を書いた後に私が見つけたものは次のとおりです。

http://www.tug.org/TUGboat/Articles/tb28-1/tb88glister.pdf

「の不幸な特性の1つ\allcharsは、元の文字列のすべてのスペースを破棄することです」とそれは言います。ハハ。

于 2009-07-11T20:22:00.487 に答える
3

TeX/LaTeXでMTGマナを入力するために私が最終的に行ったことは次のとおりです。


% http://www.tug.org/TUGboat/Articles/tb28-1/tb88glister.pdf

\newif\if@mtg@digit

\def\@mtg@testdigit#1{% lame, I know, but nothing else worked
    \@mtg@digitfalse%
    \def\@mtg@tmp{0}\ifx\@mtg@tmp#1\@mtg@digittrue\fi%
    \def\@mtg@tmp{1}\ifx\@mtg@tmp#1\@mtg@digittrue\fi%
    \def\@mtg@tmp{2}\ifx\@mtg@tmp#1\@mtg@digittrue\fi%
    \def\@mtg@tmp{3}\ifx\@mtg@tmp#1\@mtg@digittrue\fi%
    \def\@mtg@tmp{4}\ifx\@mtg@tmp#1\@mtg@digittrue\fi%
    \def\@mtg@tmp{5}\ifx\@mtg@tmp#1\@mtg@digittrue\fi%
    \def\@mtg@tmp{6}\ifx\@mtg@tmp#1\@mtg@digittrue\fi%
    \def\@mtg@tmp{7}\ifx\@mtg@tmp#1\@mtg@digittrue\fi%
    \def\@mtg@tmp{8}\ifx\@mtg@tmp#1\@mtg@digittrue\fi%
    \def\@mtg@tmp{9}\ifx\@mtg@tmp#1\@mtg@digittrue\fi%
    }


\catcode`\^^G=12

\newcommand*{\@mtg@loop}[2]{%
    \let\@mtg@callback=#1%
    \def\@mtg@string{#2}%
    \ifx\@mtg@string\@empty%
    \else%
        \@@mtg@loop#2^^G%
    \fi%
}

\def\@@mtg@loop#1#2^^G{%
    \def\@mtg@car{#1}%
    \def\@mtg@cdr{#2}%
    \ifx\@mtg@car\@empty%
        \let\@mtg@next=\@gobble%
    \else%
        \@mtg@callback{#1}%
        \ifx\@mtg@cdr\@empty%
            \let\@mtg@next=\@gobble%
        \else%
            \let\@mtg@next=\@@mtg@loop%
        \fi%
    \fi%
    \@mtg@next#2^^G%
}

\catcode`\^^G=15

% these are meant to be redefined
\def\mtg@mana#1{(\MakeUppercase{#1})}
\def\mtg@mana@colored#1{\mtg@mana{#1}}
\def\mtg@mana@colorless#1#2{\mtg@mana{#1#2}}
\def\mtg@mana@hybrid#1#2{\mtg@mana{#1/#2}}

\gdef\@mtg@terminator{.}
\gdef\@mtg@slash{/}
\let\@mtg@a=\@mtg@terminator
\let\@mtg@b=\@mtg@terminator

\def\@mtg@doChar#1{%
    \gdef\@mtg@c{#1}%
    \ifx\@mtg@a\@mtg@terminator%
    \else%
        \ifx\@mtg@b\@mtg@slash%
            \mtg@mana@hybrid{\@mtg@a}{\@mtg@c}%
            \let\@mtg@b=\@mtg@terminator%
            \let\@mtg@c=\@mtg@terminator%
        \else%
            \@mtg@testdigit\@mtg@a\if@mtg@digit%
                \@mtg@testdigit\@mtg@b\if@mtg@digit%
                    \ifx\@mtg@c\@mtg@slash%
                        \mtg@mana@colorless{}{\@mtg@a}%
                    \else%
                        \mtg@mana@colorless{\@mtg@a}{\@mtg@b}%
                        \let\@mtg@b=\@mtg@terminator%
                    \fi%
                \else%
                    \mtg@mana@colorless{}{\@mtg@a}%
                \fi%
            \else%
                \mtg@mana@colored{\@mtg@a}%
            \fi%
        \fi%
    \fi%
    \let\@mtg@a=\@mtg@b%
    \let\@mtg@b=\@mtg@c%
}

\newcommand{\mana}[1]{%
\let\@mtg@a=\@mtg@terminator%
\let\@mtg@b=\@mtg@terminator%
\@mtg@loop{\@mtg@doChar}{#1\@mtg@terminator\@mtg@terminator}}
于 2009-08-25T06:24:01.360 に答える