Skip to content

Instantly share code, notes, and snippets.

@kmaed
Created January 6, 2016 19:36
Show Gist options
  • Save kmaed/c443384bb9a3add86e20 to your computer and use it in GitHub Desktop.
Save kmaed/c443384bb9a3add86e20 to your computer and use it in GitHub Desktop.
\scantokens の使い方
%% 眠れないので書いた.etoolbox.sty を読むと勉強になるなあ(つらい).
%% まずは基本形で準備運動.
%% 一度保存された,パラメータ文字を含むトークン列を定義とする,
%% パラメータをとるマクロを定義したいとする.
\def\a{##2##1} % カテゴリコードが6である限り,# は二重にせざるをえない.
\expandafter\def\expandafter\b\expandafter#\expandafter1\expandafter#\expandafter2\expandafter{\a}
\show\b % #1#2->#2#1
%% これはひどい.\edef 使いましょうよ.
\edef\b{%
\unexpanded{\def\b#1#2}{\expandafter\unexpanded\expandafter{\a}}}% etoolbox があれば \expandonece を使う.
\show\b % ->\def \b ##1##2{##2##1}.
\b
\show\b % #1#2->#2#1
%% しかし,# を ## にいちいち変換して置換テキストを受け渡すのは美しくない.
%% そこで,カテゴリコードを12にして保存し,\scantokens で読み直す.
\catcode`\#=12
\def\a{#2#1}
\catcode`\#=6
\edef\b{%
\unexpanded{\def\b#1#2}{\expandafter
\scantokens\expandafter{\expandafter\unexpanded\expandafter{\a}\noexpand}}}
\show\b % ->\def \b ##1##2{##2##1}.
\b
\show\b % #1#2->#2#1
%% すごい(つらい)!!
\bye
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment