マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

アドベントがはじまった ― \begin{texadvent}

2012/12/01 〜 2012/12/25

TeX & LaTeX Advent Calendar

|(12/02)hak7a3 さん

というわけで始まりました。アドベントカレンダー。主催者かつ初日担当の ZR です。

冬の訪れとともに外の冷え込みも一段と厳しさを増していますが、クリスマスまでの 25 日間をできるだけ多くの皆さんの心温まる TeXLaTeX 話で埋めていきましょう。

*  *  *

というわけで早速ネタ披露。

% pLaTeX 文書
\documentclass[a6paper,papersize]{jsarticle}
\usepackage{color}
\definecolor{mygreen}{rgb}{0.0,0.6,0.2} % 色 mygreen を定義
\usepackage{pxchfon}                    % 和文フォントを指定
\setminchofont[0]{mogamb.ttc}           % 明朝→MogaMincho Bold
\setgothicfont{mplus-1p-medium.ttf}     % ゴシック→M+ 1P medium
\usepackage{tctoarulogo}                % とあるロゴの拡張機能(パッケージ)
\begin{document}
\begin{center}\huge
% \toarulogo[<色名>]<和文10文字>{<和文文字列>}
\toarulogo[mygreen]とある命令の展開制御{エクスパンドアフター}
\end{center}
\end{document}

……えーと、TeX 芸ファンの人なら既にご存じのように、itchyny さんのネタの丸パクリです(すみません……)。

わざわざ他人のネタをパクってまで言いたいことが実はあります。

素敵な TeX/LaTeX ネタを作るのに、必ずしも高度な TeX の知識は要らない

元ネタの記事に掲載されたコードを見ると、少し TeX をかじった人なら知っている基本的なプリミティブ(\kern\lower 等)がある他は LaTeX 命令で構成されています。これだと普段少し凝ったレイアウトを含む LaTeX 文書を作成している人ならできそうですね。

いや実は、このネタをするのに TeX 言語の知識は 1 ミリも要りません。以下に tctoarulogo パッケージのコードを示しますが、全部 LaTeX 命令で書かれています。

% tctoarulogo.sty
%% パッケージ宣言
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{tctoarulogo}[2012/12/01 v1.0]

%% 前提パッケージの読込
\RequirePackage{ifthen}
\RequirePackage{graphicx,color}

%% とある青色の色彩定義
\definecolor{toarublue}{rgb}{0.35,0.60,0.80}
%% とある赤色の色彩定義
\definecolor{toarured}{rgb}{0.90,0.35,0.20}

%% 変数宣言
\newlength{\toaruDimen}{}    % 汎用の長さ変数
\newcommand*{\toaruUpper}{}  % 上段部を出力するコード
\newcommand*{\toaruLower}{}  % 下段部を出力するコード
\newcommand*{\toaruColor}{}  % 色名の文字列

%%(公開) メインタイトル部分のフォント切替マクロ
\newcommand{\toarumainfont}{\rmfamily}
%%(公開) サブタイトル部分のフォント切替マクロ
\newcommand{\toarusubfont}{\sffamily\bfseries}
  % 上の 2 つはユーザが \renewcommand で再定義する.

%%(公開) \toarulogo[<色名>]<メイン文字列>{<サブ文字列>}
% とあるロゴの出力命令.
% <メイン文字列> は丁度 10 個の和文文字からなる必要がある.
% (実際には「10 個の引数」として取り扱われる.)
  % ここでは最初の7個の引数(色名と上段の文字群)を読んで,
  % \toaruColor と \toaruUpper を再定義している.
\newcommand*{\toarulogo}[7][black]{%
    % 色名を記憶する
  \renewcommand*{\toaruColor}{#1}%
    % 上段部のコード. picture 環境中の命令列である.
  \renewcommand*{\toaruUpper}{%
      % \put(横位置,縦位置){\toaruPutChar{横幅}{縦幅}{文字}}
      % を並べる. 長さの単位は 1em とする. (だから和文スケール
      % 値の違いは出力に影響しない.)
    \put(0.04,1.18){\toaruPutChar{0.91}{0.91}{#2}}%
    \put(0.74,1.18){\toaruPutChar{0.53}{0.55}{#3}}%
    \put(1.16,1.36){\toaruPutChar{0.47}{0.47}{#4}}%
    \put(1.53,1.18){\toaruPutChar{0.91}{0.91}{#5}}%
    \put(2.38,1.24){\toaruPutChar{0.78}{0.72}{#6}}%
    \put(3.11,1.18){\toaruPutChar{0.82}{0.82}{#7}}%
  }%
    % 引き続いて実行. 直後に残りの 5 個の引数があることに注意.
  \toaruNext
}

%% \toaruNext<下段文字列>{<サブ文字列>}
% toarulogo の下請け.
\newcommand*{\toaruNext}[5]{%
  \renewcommand*{\toaruLower}{%
      % 塗りつぶした四角を描く
    \put(0.37,0.07){\rule{0.87em}{1.00em}}%
      % その後に白色で最初の文字を描く
    \put(0.37,0.19){\color{white}\toaruPutChar{0.87}{1.04}{#1}}%
      % その後の 3 文字
    \put(1.22,0.34){\toaruPutChar{0.78}{0.78}{#2}}%
    \put(1.90,0.33){\toaruPutChar{0.91}{0.91}{#3}}%
    \put(2.74,0.18){\toaruPutChar{0.90}{1.13}{#4}}%
      % サブ文字列の出力
    \put(1.30,0.06){\scalebox{0.20}{\toaruSubtitle{#5}}}%
  }%
    % 引き続いて実行
  \toaruDispatch
}

%% \toaruDispatch
% toarulogo の下請け. \toaruUpper/Lower のコードを実際に
% 実行してロゴを出力する.
\newcommand*{\toaruDispatch}{%
    % 設定を局所化する必要がある.
    % ここでは「念のため」\mbox を使っている.
  \mbox{%
      % 前景色とフォント(メイン用)の設定
    \color{\toaruColor}\toarumainfont
      % \unitlength は picture で使う長さ数値の単位
    \setlength{\unitlength}{1em}%
      % picture 環境の中は単に \toaruUpper/Lower を呼ぶだけ.
    \begin{picture}(4.00,2.00)%
      \toaruUpper
      \toaruLower
    \end{picture}}%
    % これで実行終了
}

%% \toaruPutChar{<横幅>}{<縦幅>}{<文字>}
% 指定の寸法に伸縮して文字を出力する. 縦幅, 横幅は実数で
% 指定し, \unitlength 単位の長さを表す.
\newcommand*{\toaruPutChar}[3]{%
    % \toaruDimen に<文字>の横幅を代入
  \settowidth{\toaruDimen}{#3}%
    % 伸縮変形前の文字の見かけの寸法を正方形にするために
    % 高さ/深さを横幅の 0.88倍/0.12倍に強制的に合わせる.
    % 使用する和文TFMの種類により「元の縦幅」が変化する
    % 影響を無くすため. (歴史的事情により min10 や jis の
    % 高さ/深さは「奇妙な」値になっている.)
  \resizebox*{#1\unitlength}{#2\unitlength}{%
    \raisebox{0pt}[0.88\toaruDimen][0.12\toaruDimen]{#3}}%
      % \raisebox のオプション引数, および \resizebox の
      % *-形式の意味については参考書で確認してほしい.
}

%% サブタイトル部分の縮小前の横幅.
  % つまりサブタイトル部分は 6.8 文字分の横幅を確保して
  % いる. (実際は和文スケールの影響を受ける.)
  % 実際に出力する際には 0.2 倍のスケールが施されるので
  % 横幅は 1.36em となる.
\newcommand*{\toaruSubtWidth}{6.8em}
\newcommand*{\toaruSubtitle}[1]{%
    % ここでは文字列の横幅に応じて処理を変える. そのため
    % 横幅を調べて \toaruDimen に代入する.
  \settowidth{\toaruDimen}{\toarusubfont #1}%
  \ifthenelse{\lengthtest{\toaruDimen < \toaruSubtWidth}}{%
      % 横幅が確保した幅より小さい場合は均等割りにする.
      % 均等割りは \kanjiskip による方法を利用した. ただし
      % この方法は min10 使用時に小書き仮名の出力が不正になる
      % という欠点がある.
    \setlength{\kanjiskip}{0pt plus 1fill minus 1fill}%
    \makebox[\toaruSubtWidth][s]{\toarusubfont #1}%
      % オプション s は「両端揃え」を表す.
  }{%
      % 横幅が確保した幅より大きい場合は横方向に縮小する.
    \resizebox{\toaruSubtWidth}{\height}{\toarusubfont #1}%
  }%
    % ちなみに, サブ用のフォントへの切替を一番内側で行って
    % いる理由は, em の長さが変わってしまうのを避けるため.
}

%% EOF

そうです。TeX を知らなくても TeX 芸はできます。\expandafter が何をするものか皆目わからなくても \expandafter ネタは出せます。TeX & LaTeX Advent Calendar は TeXnician に限らず、TeX 言語学習者に限らず、LaTeX 初心者を含む TeX ユーザみんなのイベントです。気おくれせずにどしどし参加してください。

おねがいします。

(2 日目は hak7a3 さんです。)