スタイルファイルを作ってみたのですが。

スタイルファイルを作ってみたのですが。

- 内山 伸久 の投稿
返信数: 15
奥村様の入門書を元に見様見真似でスタイルファイルを作ってみたのですが、
アラートが出てうまくいきません。抜本的に何かが足りないか間違っているようです。ご教示頂ければ幸いです。

\NeedsTeXFormat{LaTeX2e}%

\ProvidesFile{%

utiyama%

.sty%

}%

\def\@makechapterhead#1{

{\parindent=0pt \normalfont\Huge\headfont

{\color [gray]{0.5}\rule[-0.5zw]{2zw}{1.8zw}}

\if@mainmatter

\hspace {-2zw}\raisebox{0.1zw}{

\makebox [2zw]{\color[gray]{1}\huge\headfont\thechapter}}

\fi

\hspace {0.5zw}#1\par\nobreak

\vskip 15mm}}

\renewcommand{\section}{

\@startsection{section}{1}{0mm}

{5mm plus 2mm minus 1mm}

{3mm plus 1mm}

{\normalfont\Large\headfont

\begin{tikzpicture}

\useasboundingbox (0,0) rectangle (0,0);

\fill [black!50] (0,-4pt) rectangle (8pt,12pt);

\draw [black!50,line width=1pt] (0,-4pt) -- (\linewidth,-4pt);

\end{tikzpicture}

\hspace{1zw}}}


内山 伸久 への返信

Re: スタイルファイルを作ってみたのですが。

- 和田 勇 の投稿

ちょっと長くなってしまいましたが、デバッグの参考になればと思います。(思ったように Markdown が制御できない )

  • テスト用サンプルメイン

    \documentclass{article}
    \usepackage{tikz}
    \usepackage{utiyama}
    \begin{document}
    \section{サンプル}
    COVID-19 なんて心配しない暮らしがしたい
    \end{document}
    
  • 以下の様なエラーが出ていると思います

    ABD: EveryShipout initializing macros
    ! Undefined control sequence.
    argument>  
                                        \begin {tikzpicture} \useasboundingb...
    l.5 \section{サンプル}
    
  • 問題の箇所

    utiyama.sty
    
    \renewcommand{\section}{
      \@startsection{section}{1}{0mm}
      {5mm plus 2mm minus 1mm}
      {3mm plus 1mm}
      { 
    
  • section を再定義したいようだがどこをベースにしたか探してみた

    /usr/local/texlive/2020/texmf-dist/source/platex/jsclasses/jsclasses.dtx
    1848:% 見出し用のフォントは |\bfseries| 固定ではなく,|\headfont|
    1858:% \newcommand{\headfont}{\bfseries}
    1859:\newcommand{\:<font color="red">headfont</font>}{\gtfamily\sffamily}
    
    /usr/local/texlive/2020/texmf-dist/doc/fonts/japanese-otf/readme-ja.txt
    45:redeffont.styでは,見出しがgt/bxに割り当てられているフォントになります.これを例えばgt/mにしたい場合,\headfontを
    47:&gt;\let\<font color="red">headfont</font>=\gtfamily
    186:・redeffont.styで\headfontを再定義しても,正しく置き変わらなかった不具合を修正[redeffont.sty]
    そのほかは省略
    
  • 対策( js で始まるクラスの section を参照か、それとも ...)

  • その1 jsaricle を使ってみる
        \documentclass{jsarticle} %% ここ
        \usepackage{tikz}
        \usepackage{utiyama}
        \begin{document}
        \section{サンプル}
        COVID-19 なんて心配しない生活をおくりたい
        \end{document}
        
  • その2 headfont を定義する(documentclass はそのまま \let\headfont\=\gtfamily を utiyama.sty で定義しておくか test.tex で定義しておく)

    \documentclass{article}
    \usepackage{tikz}
    \let\headfont=\gtfamily %% 例えばこの辺
    \usepackage{utiyama}
    \begin{document}
    \section{サンプル}
    COVID-19 なんて心配しない生活をおくりたい
    \end{document}
    
和田 勇 への返信

Re: スタイルファイルを作ってみたのですが。

- 内山 伸久 の投稿
和田様

ありがとうございます。

問題解決いたしました。

2例ともうまくいきました。

御礼申し上げます。
和田 勇 への返信

Re: スタイルファイルを作ってみたのですが。

- 内山 伸久 の投稿

\NeedsTeXFormat{LaTeX2e}%

\ProvidesFile{%

utiyama%

.sty%

}%

\def\@makechapterhead#1{

{\parindent=0pt \normalfont\Huge\headfont

{\color [gray]{0.5}\rule[-0.5zw]{2zw}{1.8zw}}

\if@mainmatter

\hspace {-2zw}\raisebox{0.1zw}{

\makebox [2zw]{\color[gray]{1}\huge\headfont\thechapter}}

\fi

\hspace {0.5zw}#1\par\nobreak

\vskip 15mm}}

\renewcommand{\section}{

\@startsection{section}{1}{0mm}

{5mm plus 2mm minus 1mm}

{3mm plus 1mm}

{\normalfont\Large\headfont

\begin{tikzpicture}

\useasboundingbox (0,0) rectangle (0,0);

\fill [black!50] (0,-4pt) rectangle (8pt,12pt);

\draw [black!50,line width=1pt] (0,-4pt) -- (\linewidth,-4pt);

\end{tikzpicture}

\hspace{1zw}}}

\renewcommand{\ps@plain}{

\let\ps@jpl@in\ps@plain \let \@mkboth\@gobbletwo

\renewcommand{\@oddhead}{

\rlap{\raisebox{-\headsep-\textheight}[0pt][0pt]{

\parbox[b][\textheight][c]{\textwidth}{\centering

\scalebox{5}{\textcolor[gray]{.7}{\textgt{緊急事態}}}}}}

\hfill}}

\pagestyle{plain}

\AtEndDocument{\label{lastpage}}

\newcommand{\ps@total}{

\let\@mkboth\@gobbletwo

\def\@oddfoot{\normalfont\hfil--\thepage/\pageref{lastpage}--\hfil}

\let\@evenfoot\@oddfoot}

\pagestyle{total}


少し付け足したのですが、アラートが出ます。

対処方法をご教示頂ければ幸いです。

内山 伸久 への返信

Re: スタイルファイルを作ってみたのですが。

- 和田 勇 の投稿

添付の改造スタイルファイルを参考にしてください

  • \pagestyle{plain}\pagestyle{total} は一般的には スタイルファイルではなく本文の必要なところで

  • \raisebox の最初のパラメータに持ち上げる長さを指定する場合は別途前もって以下のような感じで計算しておいたものを利用してみてください。

    \newlength{\MyLen}
    \setlength{\MyLen}{-\headsep}
    \addtolength{\MyLen}{-\textheight}
    
  • \parabox に与えるパラメータは誤解されているのかな?

    \parbox[b][\textheight][c]{\textwidth}{\centering 。。。}

    となっていましたが

    \parabox[位置]{幅}{テキスト} % 位置は c t b

  • \documentclass[dvipdfmx]{jsarticle} のように [dvipdfmx] オプションを追加されると良いでしょう

    追加しないと dvipdfmx:warning: Unknown token のメッセージがたくさん出ると思います

  • テスト用に使用したもの

    \documentclass[dvipdfmx]{jsarticle}
    \usepackage{tikz}
    %\let\headfont=\gtfamily
    \usepackage{utiyama}
    \begin{document}
    \pagestyle{plain}
    \section{サンプル}
    COVID-19 なんて心配しない生活をおくりたい
    \newpage
    \pagestyle{total}
    \section{サンプル}
    COVID-19 第二波お断り
    \end{document}
    
和田 勇 への返信

Re: スタイルファイルを作ってみたのですが。

- 内山 伸久 の投稿
和田様

ありがとうございます。

\newlength{\MyLen}

\setlength{\MyLen}{-\headsep}

\addtolength{\MyLen}{-\textheight}

のやり方は知らなかったのでいい勉強になりました。


丁寧なご対応ありがとうございました。

和田 勇 への返信

Re: スタイルファイルを作ってみたのですが。

- ut の投稿

> \parabox に与えるパラメータは誤解されているのかな?

LaTeX2e: An unofficial reference manual, March 2020 (https://latexref.xyz) より:
添付 parbox_synopses.jpg
ut への返信

Re: スタイルファイルを作ってみたのですが。

- 和田 勇 の投稿
和田 勇 への返信

Re: スタイルファイルを作ってみたのですが。

- 内山 伸久 の投稿
和田様 ut

スタイルファイル内で\makeatletter \makeatotherを使うことはありなのでしょうか。

\NeedsTeXFormat{LaTeX2e}%

\ProvidesFile{%

utiyama02%

.sty%

}%

\makeatletter

\def\@makechapterhead#1{

{\parindent=0pt \normalfont\Huge\headfont

{\color [gray]{0.5}\rule[-0.5zw]{2zw}{1.8zw}}

\if@mainmatter

\hspace {-2zw}\raisebox{0.1zw}{

\makebox [2zw]{\color[gray]{1}\huge\headfont\thechapter}}

\fi

\hspace {0.5zw}#1\par\nobreak

\vskip 15mm}}

\renewcommand{\section}{

\@startsection{section}{1}{0mm}

{5mm plus 2mm minus 1mm}

{3mm plus 1mm}

{\normalfont\Large\headfont

\begin{tikzpicture}

\useasboundingbox (0,0) rectangle (0,0);

\fill [black!50] (0,-4pt) rectangle (8pt,12pt);

\draw [black!50,line width=1pt] (0,-4pt) -- (\linewidth,-4pt);

\end{tikzpicture}

\hspace{1zw}}}\renewcommand{\ps@plain}{

\let\ps@jpl@in\ps@plain \let \@mkboth\@gobbletwo

\renewcommand{\@oddhead}{

\rlap{\raisebox{-\headsep-\textheight}[0pt][0pt]{

\parbox[b][\textheight][c]{\textwidth}{\centering

\scalebox{5}{\textcolor[gray]{.7}{\textgt{緊急事態}}}}}}

\hfill}}

\AtEndDocument{\label{lastpage}}

\newcommand{\ps@total}{

\let\@mkboth\@gobbletwo

\def\@oddfoot{\normalfont\hfil--\thepage/\pageref{lastpage}--\hfil}

\let\@evenfoot\@oddfoot}

\makeatother


ご教示頂ければ幸いです。

内山 伸久 への返信

Re: スタイルファイルを作ってみたのですが。

- TONE Kozaburo の投稿
>スタイルファイル内で\makeatletter \makeatotherを使うことはありなのでしょうか。

スタイルファイル内では上記の制御綴(コマンド)は不要です。

プリアンブルで @ 付きの内部コマンド(制御綴)を使うために必要になります。

参考:奥村晴彦著「改訂第7版 LaTeX2e美文書作成入門」pp298-299、2017年、技術評論社
TONE Kozaburo への返信

Re: スタイルファイルを作ってみたのですが。

- 内山 伸久 の投稿
TONE Kozaburo

ありがとうございます。

とすると
\parbox[b][\textheight][c]{\textwidth}{\centering

の定義を生かしたままスタイルファイルを作るのはどうすればよろしいでしょうか。

ご教示頂ければ幸いです。


内山 伸久 への返信

Re: スタイルファイルを作ってみたのですが。

- TONE Kozaburo の投稿
スタイルファイル内では\makeatletterと\makeatotherは不要なので削除してしまうか、頭に%をつけて無効化(コメント化)してしまえば良いでしょう。

他は触る必要は無いと思います。

新たな定義などをプリアンブルで試して大丈夫なのを確認したら\makeatletterと\makeatotherを省いたものをスタイルファイルに移すと考えられれば良いでしょう。
TONE Kozaburo への返信

Re: スタイルファイルを作ってみたのですが。

- 内山 伸久 の投稿
TONE Kozaburo

ありがとうございます。

解決いたしました。

重ねて御礼申し上げます。
内山 伸久 への返信

Re: スタイルファイルを作ってみたのですが。

- ut の投稿

# 既に解決されたトピックに対して、甚だ遅れ馳せではありますが…。

> スタイルファイル内で\makeatletter \makeatotherを使うことはありなのでしょうか。

とのことでしたが、少し話がズレてしまいますけれど、先日の、

> ノンブルにダーシを付けたいのですが。
> 2020年 06月 22日(月曜日) 13:08 - 内山 伸久 の投稿

というご質問を拝読した際にもちょっと思ったのですが、内山さんは、既存のパッケージは敢えて使わないということにされてらっしゃるのでしょうか?

ページスタイルのカスタマイズでしたら、fancyhdr.sty が定番だと思われますが、それを使われずに、ご自分で再定義をされてらっしゃいました。また、今回の御質問についても、

> 少し付け足したのですが、

の部分を拝見した際も、「あれ、lastpage.sty は使わないんだ…」と思ってしまいました。

もちろん、何でもご自分でやってみるというのはとても大事なことだとは思うのですけれど、既存のパッケージのドキュメントなどもお読みになられると、何かしら得られるものもあるのではないかと思います。

以下には、ご参考までに、fancyhdr.sty のドキュメントからの抜き書きと、先日触れた LaTeX2e: An unofficial reference manual からの抜き書きを貼っておきます:

添付 excerpt.jpg
ut への返信

Re: スタイルファイルを作ってみたのですが。

- しっぽ 愛好家 の投稿

「自分の文書を作成する」場合と「クラスファイルやパッケージを書く」場合とではいささか話が異なります.実際,

  • クラスファイル・パッケージ内で不用意にパッケージを読み込むと,読み込まれたものと同じパッケージをユーザー自身がプリアンブルで読み込もうとしても「Option clash」が起きてユーザーの意図通りには読み込めない場合がある
  • 既存のパッケージには「余計なこと」(例えば,\chaptar などの内部処理を勝手に変更)までするものがある
  • パッケージに適用されているライセンスによっては,自作のクラスファイル・パッケージに組み込めないかもしれない
といった可能性があります.

クラスファイル等を自作する場合に最も問題となるのは(少なくとも私に関しては)上記の 2 番目の点です.また,自作パッケージの類を他者に使ってもらおうとすると,上記の最初の点には留意すべきでしょう.例えば,「クラスファイル内で geometry パッケージを用いてページレイアウトを設定する」のは,一般的には NG です(「特定用途の,ユーザー自身でのページレイアウト変更は認めない」クラスファイルについては話は別ですが).実際,そんなマネをしたら,ユーザー自身がプリアンブルで geometry パッケージを用いた際に困ります.

私にしても「自分では面倒を見きれないもの・見る気がないもの(例えば,graphicx)を読み込む」,「想定しているユーザーならたいてい読み込むと思われるので,体裁のばらつきを防ぐためにあらかじめ読み込んでおく(例えば,amsmath)」といったことはあります.その場合であっても「Option clash」を避けるために,「読み込まれていなければ,読み込む」処理を \AtBeginDocument で仕込むといった注意を払います.

あと,(これは,クラスファイル・パッケージを書く場合に限りませんが)どんなパッケージでも無制限に併用できるわけではありませんし,既製品を使うか否かはあくまでも「自己責任」です(もっとも,「使わない」という選択肢を選択しうるようになるための学習なんて,たいていのユーザーはやりませんがね).

なお,パッケージ内における \makeatletter,\makeatother に関しては,少なくとも \usepacakge(\RequirePackage)で読み込む限り,「使ってはいけない」というのは(LaTeX 2.09 時代の記憶を引きずった)誤解です.\usepacakge(\RequirePackage)での読み込みの際には,文字「@」のカテゴリーコードに関して,退避・\makeatletter による再設定・復元が行われます(下記のサンプルを参照してください).もっとも,\makeatletter,\makeatother に限らず,カテゴリーコードの変更は適切なグルーピングとともに行うのが適切なので,下記の mysample00.sty のような記述は「例のための例」です.

%%% mysample.sty
\ProvidesPackage{mysample}[2020/07/03 v.1.0 sample package]
\RequirePackage{mysample00}%%% mysample00.sty 内で \makeatother を用いているが
\def\@sample@text{This is a meaningless sample text.}%%% この定義には影響しない
\def\sampletext{[\@sample@text]}

%%% mysample00.sty
\ProvidesPackage{mysample00}[2020/07/03 v.1.0 sample package]
\def\AtAsLetter{@}%%% 「文字」扱いの「@」の別名を提供
\makeatother
\def\AtAsOther{@}%%% 通常の「@」の別名を提供

%%% test.tex
\documentclass{article}
\usepackage{mysample}
\begin{document}
\sampletext

\ifcat @\AtAsOther [`At' is an `other' character.]\fi
\end{document}
しっぽ 愛好家 への返信

Re: スタイルファイルを作ってみたのですが。

- 本田 知亮 の投稿
>\usepacakge(\RequirePackage)での読み込みの際には,文字「@」のカテゴリーコードに関して,退避・\makeatletter による再設定・復元が行われます(下記のサンプルを参照してください)

この細工ってシンプルですけど巧妙ですよね.
グルーピングでの待機・復旧ができない場合に,
特定の状態を待機・復旧させるための
いいサンプルだと思います.

しっぽ愛好家さんご指摘の部分は
\RequirePackage/\usepackageなどの
LaTeXがオプション付きで何かのファイルを読み込むときに
最後に到達する\@onefilewithoptionsの中の
\@pushfilename(とその直後の\makeatletter)と\@popfilenameの部分だと思います.

マクロ名が「filename」なのでスルーしてしまいそうですが,@のカテゴリーコード「も」push/popしていて,
TeX on LaTeXの沼をお気軽に垣間見れます.