2012/12/01 〜 2012/12/25TeX & LaTeX Advent Calendar
というわけで始まりました。アドベントカレンダー。主催者かつ初日担当の ZR です。
冬の訪れとともに外の冷え込みも一段と厳しさを増していますが、クリスマスまでの 25 日間をできるだけ多くの皆さんの心温まる TeX/LaTeX 話で埋めていきましょう。
* * *
というわけで早速ネタ披露。
% 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 さんです。)