マークテスト作成に当たって「marksheet.sty」の導入

マークテスト作成に当たって「marksheet.sty」の導入

- たなかな の投稿
返信数: 15
使用環境
Win10,TeXLive2023,TeXWorks(pLaTeX(ptex2pdf))

質問内容
マーク式テストを作成中です。今までは手打ちで「ア」と入力したものを枠囲みしていたのですが、調べてみると「marksheet.sty」という希望通りのものを公開されている方がおり、早速導入してみたのですが、エラーが出てしまい、うまくいきません。どこが間違っているのか、ご指摘いただければと思います。

導入手順
1.公開されているコードをメモ帳にコピペ、UTF-8で保存した後「marksheet.sty」とファイル名を変更
2.styファイルをtexファイルと同フォルダ内に保存
3.下記texファイルを実行→エラー

texファイルの中身
\documentclass{jsarticle}
\usepackage{amsmath}
\usepackage{marksheet}
\begin{document}
\markbox{10}
$(x+1)(x-10) = 0 \Leftrightarrow x= \markbox[label]{2}, \markbox[label2]{2}$である.
ただし$\refhosomarkbox[label]{2} < \refhosomarkbox[label2]{2}.$
\end{document}

marksheet.styの中身
%
% marksheet.sty
%
% 使用例:
% \usepackage{marksheet}
%
% $(x+1)(x-10) = 0 \Leftrightarrow x= \markbox[label]{2}, \markbox[label2]{2}$である.
%
% ただし $\refhosomarkbox[label]{2} < \refhosomarkbox[label2]{2}.$
%
% また $2^{\refhososemamarkbox[label]{2}} = \frac{\markbox{1}}{\markbox{1}}, 2^{\refhososemamarkbox[label2]{2}} = \markbox{4}$である.
%

\usepackage{ifthen}

\def\@katakana#1{\ifcase#1 京\or ア\or イ\or ウ\or エ\or オ\or カ\or キ\or ク\or ケ\or コ\or サ\or シ\or ス\or セ\or ソ\or タ\or チ\or ツ\or テ\or ト\or ナ\or ニ\or ヌ\or ネ\or ノ\or ハ\or ヒ\or フ\or ヘ\or ホ\or マ\or ミ\or ム\or メ\or モ\or ヤ\or ユ\or ヨ\or ラ\or リ\or ル\or レ\or ロ\or ワ\or ヲ\or ン\else\@ctrerr\fi}

\def\katakana#1{\expandafter\@katakana\csname c@#1\endcsname}%アイウエオ

\newcounter{countermark}
\setcounter{countermark}{0}
\newcounter{tempcountermark}
\setcounter{tempcountermark}{0}
\newcounter{itermark}
\setcounter{itermark}{0}

\newcommand{\resetmark}[0]{\setcounter{countermark}{0}}

\newcommand{\markboxletter}[2][]{\refstepcounter{countermark}\ifx{#1}{}{}\else{\label{#1}}\fi\katakana{countermark}\setcounter{itermark}{1}\whiledo{\value{itermark}<#2}{\refstepcounter{countermark}\katakana{countermark}\addtocounter{itermark}{1}}}

\newcommand{\refmarkboxletter}[2][]{\setcounter{tempcountermark}{\ref{#1}}\setcounter{itermark}{0}\whiledo{\value{itermark}<#2}{\katakana{tempcountermark}\refstepcounter{tempcountermark}\addtocounter{itermark}{1}}}

\newcommand{\waku}[1]{\fboxrule=1.0pt \fboxsep=2.1pt \fbox{\ \bf{#1}\ }}
\newcommand{\hosowaku}[1]{\fboxrule=0.5pt \fboxsep=2.5pt \fbox{\ {#1}\ }}
\newcommand{\semawaku}[1]{\fboxrule=1.0pt \fboxsep=0.8pt \fbox{\bf{#1}}}
\newcommand{\hososemawaku}[1]{\fboxrule=0.5pt \fboxsep=1.0pt \fbox{#1}}

\newcommand{\markbox}[2][]{\waku{\markboxletter[#1]{#2}}}
\newcommand{\refmarkbox}[2][]{\waku{\refmarkboxletter[#1]{#2}}}
\newcommand{\hosomarkbox}[2][]{\hosowaku{\markboxletter[#1]{#2}}}
\newcommand{\refhosomarkbox}[2][]{\hosowaku{\refmarkboxletter[#1]{#2}}}
\newcommand{\semamarkbox}[2][]{\semawaku{\markboxletter[#1]{#2}}}
\newcommand{\refsemamarkbox}[2][]{\semawaku{\refmarkboxletter[#1]{#2}}}
\newcommand{\hososemamarkbox}[2][]{\hososemawaku{\markboxletter[#1]{#2}}}
\newcommand{\refhososemamarkbox}[2][]{\hososemawaku{\refmarkboxletter[#1]{#2}}}


エラー内容
! Missing number, treated as zero.
<to be read again>
                  \xparse function is not expandable
l.7 ただし$\refhosomarkbox[label]{2}
                                    < \refhosomarkbox[label2]{2}.$


texファイル、styファイルをまとめたものを添付しております。
どうかお力をお貸しください。よろしくお願いいたします。
たなかな への返信

Re: マークテスト作成に当たって「marksheet.sty」の導入

- はやて (h20y6m) の投稿

\ref が展開不能になったためではないでしょうか。

と同じではないかと。

展開可能な \ref を自分で用意して \ref の代わりに使うことになるのかな?

\def\marksheet@ref#1{%
  \expandafter\expandafter\expandafter
      \marksheet@ref@a\csname r@#1\endcsname}
\def\marksheet@ref@a#1{%
  \ifx#1\relax0\else
    \expandafter\@firstoffive#1\fi}

\newcommand{\refmarkboxletter}[2][]{\setcounter{tempcountermark}{\marksheet@ref{#1}}\setcounter{itermark}{0}\whiledo{\value{itermark}&lt;#2}{\katakana{tempcountermark}\refstepcounter{tempcountermark}\addtocounter{itermark}{1}}}
はやて (h20y6m) への返信

Re: マークテスト作成に当たって「marksheet.sty」の導入

- たなかな の投稿
返信ありがとうございます。
自力で模索しているときに、\refのみで実行した際うまく数値が呼び出せたのですが、これはたまたまだったのですね。

ご提示いただいたコードをもとに、marksheet.styを以下のように修正しました。

%
% marksheet.sty
%
% 使用例:
% \usepackage{marksheet}
%
% $(x+1)(x-10) = 0 \Leftrightarrow x= \markbox[label]{2}, \markbox[label2]{2}$である.
%
% ただし $\refhosomarkbox[label]{2} < \refhosomarkbox[label2]{2}.$
%
% また $2^{\refhososemamarkbox[label]{2}} = \frac{\markbox{1}}{\markbox{1}}, 2^{\refhososemamarkbox[label2]{2}} = \markbox{4}$である.
%

\usepackage{ifthen}

\def\@katakana#1{\ifcase#1 京\or ア\or イ\or ウ\or エ\or オ\or カ\or キ\or ク\or ケ\or コ\or サ\or シ\or ス\or セ\or ソ\or タ\or チ\or ツ\or テ\or ト\or ナ\or ニ\or ヌ\or ネ\or ノ\or ハ\or ヒ\or フ\or ヘ\or ホ\or マ\or ミ\or ム\or メ\or モ\or ヤ\or ユ\or ヨ\or ラ\or リ\or ル\or レ\or ロ\or ワ\or ヲ\or ン\else\@ctrerr\fi}

\def\katakana#1{\expandafter\@katakana\csname c@#1\endcsname}%アイウエオ

\def\marksheet@ref#1{%
\expandafter\expandafter\expandafter
\marksheet@ref@a\csname r@#1\endcsname}
\def\marksheet@ref@a#1{%
\ifx#1\relax0\else
\expandafter\@firstoffive#1\fi}

\newcounter{countermark}
\setcounter{countermark}{0}
\newcounter{tempcountermark}
\setcounter{tempcountermark}{0}
\newcounter{itermark}
\setcounter{itermark}{0}

\newcommand{\resetmark}[0]{\setcounter{countermark}{0}}

\newcommand{\markboxletter}[2][]{\refstepcounter{countermark}\ifx{#1}{}{}\else{\label{#1}}\fi\katakana{countermark}\setcounter{itermark}{1}\whiledo{\value{itermark}<#2}{\refstepcounter{countermark}\katakana{countermark}\addtocounter{itermark}{1}}}

\newcommand{\refmarkboxletter}[2][]{\setcounter{tempcountermark}{\marksheet@ref{#1}}\setcounter{itermark}{0}\whiledo{\value{itermark}<#2}{\katakana{tempcountermark}\refstepcounter{tempcountermark}\addtocounter{itermark}{1}}}

\newcommand{\waku}[1]{\fboxrule=1.0pt \fboxsep=2.1pt \fbox{\ \bf{#1}\ }}
\newcommand{\hosowaku}[1]{\fboxrule=0.5pt \fboxsep=2.5pt \fbox{\ {#1}\ }}
\newcommand{\semawaku}[1]{\fboxrule=1.0pt \fboxsep=0.8pt \fbox{\bf{#1}}}
\newcommand{\hososemawaku}[1]{\fboxrule=0.5pt \fboxsep=1.0pt \fbox{#1}}

\newcommand{\markbox}[2][]{\waku{\markboxletter[#1]{#2}}}
\newcommand{\refmarkbox}[2][]{\waku{\refmarkboxletter[#1]{#2}}}
\newcommand{\hosomarkbox}[2][]{\hosowaku{\markboxletter[#1]{#2}}}
\newcommand{\refhosomarkbox}[2][]{\hosowaku{\refmarkboxletter[#1]{#2}}}
\newcommand{\semamarkbox}[2][]{\semawaku{\markboxletter[#1]{#2}}}
\newcommand{\refsemamarkbox}[2][]{\semawaku{\refmarkboxletter[#1]{#2}}}
\newcommand{\hososemamarkbox}[2][]{\hososemawaku{\markboxletter[#1]{#2}}}
\newcommand{\refhososemamarkbox}[2][]{\hososemawaku{\refmarkboxletter[#1]{#2}}}

しかし、また別のエラーが出るようになりました。
! Missing = inserted for \ifnum.
&
l.7 ただし$\refhosomarkbox[label]{2}
< \refhosomarkbox[label2]{2}.$
?

wikiのエラーメッセージ一覧から\ifnumまたは\ifdimとのことでしたが、どこにも見当たりません。
すみませんが引き続きご助力いただけますでしょうか。
たなかな への返信

Re: マークテスト作成に当たって「marksheet.sty」の導入

- Z. R. の投稿

展開が一回余分に多い気がしますね。

(「\marksheet@ref@a\r@label」とならないといけないはずなので。)

\def\marksheet@ref#1{%
\expandafter
\marksheet@ref@a\csname r@#1\endcsname}
Z. R. への返信

Re: マークテスト作成に当たって「marksheet.sty」の導入

- たなかな の投稿
返信ありがとうございます。
早速修正してみましたが、変わらずエラーメッセージが表示されます。

! Missing = inserted for \ifnum.
&
l.7 ただし$\refhosomarkbox[label]{2}
< \refhosomarkbox[label2]{2}.$
?

マクロの知識がなく、皆様に頼りきりなのが申し訳ないですが、今しばらくご助力いただければと思います。
たなかな への返信

Re: マークテスト作成に当たって「marksheet.sty」の導入

- たなかな の投稿
はやて氏に頂いた
\newcommand{\refmarkboxletter}の中に"&lt;"というのがあったので、他と比較して不等号の記号に置き直したところ、次のエラーが出ました。
(うまく表示されないようなので全角で書いてます)
! Undefined control sequence.
\@firstoffive

そして、もう一度コンパイルするとうまく通るのですが、表示される内容がうまくいってないようで、refの方の表示が2つとも京アになってしまいました。

何度かコンパイルしたところ、上記2通りの繰り返しになっています。
下に修正したstyファイルの中身を転記します。

marksheet.sty
%
% marksheet.sty
%
% 使用例:
% \usepackage{marksheet}
%
% $(x+1)(x-10) = 0 \Leftrightarrow x= \markbox[label]{2}, \markbox[label2]{2}$である.
%
% ただし $\refhosomarkbox[label]{2} < \refhosomarkbox[label2]{2}.$
%
% また $2^{\refhososemamarkbox[label]{2}} = \frac{\markbox{1}}{\markbox{1}}, 2^{\refhososemamarkbox[label2]{2}} = \markbox{4}$である.
%

\usepackage{ifthen}

\def\@katakana#1{\ifcase#1 京\or ア\or イ\or ウ\or エ\or オ\or カ\or キ\or ク\or ケ\or コ\or サ\or シ\or ス\or セ\or ソ\or タ\or チ\or ツ\or テ\or ト\or ナ\or ニ\or ヌ\or ネ\or ノ\or ハ\or ヒ\or フ\or ヘ\or ホ\or マ\or ミ\or ム\or メ\or モ\or ヤ\or ユ\or ヨ\or ラ\or リ\or ル\or レ\or ロ\or ワ\or ヲ\or ン\else\@ctrerr\fi}

\def\katakana#1{\expandafter\@katakana\csname c@#1\endcsname}%アイウエオ

\def\marksheet@ref#1{%
\expandafter
\marksheet@ref@a\csname r@#1\endcsname}
\def\marksheet@ref@a#1{%
\ifx#1\relax0\else
\expandafter\@firstoffive#1\fi}



\newcounter{countermark}
\setcounter{countermark}{0}
\newcounter{tempcountermark}
\setcounter{tempcountermark}{0}
\newcounter{itermark}
\setcounter{itermark}{0}

\newcommand{\resetmark}[0]{\setcounter{countermark}{0}}

\newcommand{\markboxletter}[2][]{\refstepcounter{countermark}\ifx{#1}{}{}\else{\label{#1}}\fi\katakana{countermark}\setcounter{itermark}{1}\whiledo{\value{itermark}<#2}{\refstepcounter{countermark}\katakana{countermark}\addtocounter{itermark}{1}}}

\newcommand{\refmarkboxletter}[2][]{\setcounter{tempcountermark}{\marksheet@ref{#1}}\setcounter{itermark}{0}\whiledo{\value{itermark}<#2}{\katakana{tempcountermark}\refstepcounter{tempcountermark}\addtocounter{itermark}{1}}}

\newcommand{\waku}[1]{\fboxrule=1.0pt \fboxsep=2.1pt \fbox{\ \bf{#1}\ }}
\newcommand{\hosowaku}[1]{\fboxrule=0.5pt \fboxsep=2.5pt \fbox{\ {#1}\ }}
\newcommand{\semawaku}[1]{\fboxrule=1.0pt \fboxsep=0.8pt \fbox{\bf{#1}}}
\newcommand{\hososemawaku}[1]{\fboxrule=0.5pt \fboxsep=1.0pt \fbox{#1}}

\newcommand{\markbox}[2][]{\waku{\markboxletter[#1]{#2}}}
\newcommand{\refmarkbox}[2][]{\waku{\refmarkboxletter[#1]{#2}}}
\newcommand{\hosomarkbox}[2][]{\hosowaku{\markboxletter[#1]{#2}}}
\newcommand{\refhosomarkbox}[2][]{\hosowaku{\refmarkboxletter[#1]{#2}}}
\newcommand{\semamarkbox}[2][]{\semawaku{\markboxletter[#1]{#2}}}
\newcommand{\refsemamarkbox}[2][]{\semawaku{\refmarkboxletter[#1]{#2}}}
\newcommand{\hososemamarkbox}[2][]{\hososemawaku{\markboxletter[#1]{#2}}}
\newcommand{\refhososemamarkbox}[2][]{\hososemawaku{\refmarkboxletter[#1]{#2}}}

よろしくお願いいたします。
たなかな への返信

Re: マークテスト作成に当たって「marksheet.sty」の導入

- 和田 勇 の投稿
どなたかが検証中だと思いますが、相当時間誰も応答しないので、
不得手な分野ですが、添付された marksheet.tex marksheet.sty を利用して
「(u)platex marksheet」を2回以上連続して試してみましたが、
ご報告のような状況にはなりませんでした。
(本文中に記載された marksheet.sty と添付ファイル marksheet.zip の marksheet.sty は
 「\def\marksheet@ref@a#1」の定義位置が少々異なるものの、報告されているような
  エラーを誘発するものではないので、同じだとして扱います。)

marksheet.log を見るとわかるかもしれませんが、
マクロなどを調整している時、
誤った情報が .aux などの生成ファイルに書き込まれ、
以降、何度やってもエラーになるケースが時々あります。

今回のは状況とはちょっと違うようにも見えますが、
自動生成ファイルを削除してみてはいかがでしょうか?

「 latexmk -C marksheet」とか「llmk -C marksheet」で
.log .aux など自動生成ファイルを削除することができます。

すでに実施済みでエラーとなっている場合は、marksheet.log をアップロードしてください。
なお、ログは二つのケースがそれぞれ必要ですので、
エラー状況のわかる名前にリネームするなどの工夫をお願いします。

和田 勇 への返信

Re: マークテスト作成に当たって「marksheet.sty」の導入

- たなかな の投稿
環境が職場PC内のためお返事遅くなってしまいすみません。
自動生成をいったんすべて削除し、.texと.styファイルのみにして試しましたが、上記のエラーが発生します。
.logファイルを添付します。
エラーが発生しない場合→通った.log
エラーが発生した場合→エラー.log
です。よろしくお願いいたします。
たなかな への返信

Re: マークテスト作成に当たって「marksheet.sty」の導入

- 和田 勇 の投稿
大隈さんの方が、この件に関しては詳しいようなので、
大隈さんの意見を参考にしてください。

とはいえ、なぜ、私の環境で何故問題なく uplatex が複数回、
問題なく処理できるか確認してみました。

少なくとも今日時点で tlmgr update --self --all でアップデートすると
なんら問題なく処理可能になります。

確かに update する前の Windows環境、macOS 環境では2回目でエラーになりますが、
今日時点にアップデートするといずれも問題なく処理できます。

ちなみにアップデートすると .aux は以下のように若干出力が変更されています。

              \relax
              \newlabel{}{{1}{1}{}{}{}}
              \newlabel{label}{{11}{1}{}{}{}}
              \newlabel{label2}{{13}{1}{}{}{}}
              \gdef \@abspage@last{1}

アップデート前とアップデート後に処理した時の .log を見比べると
その違いの主要な部分は以下の通り。

          --- marksheet-old/marksheet.log 2023-07-03 21:25:37.202115329 +0900
          +++ marksheet/marksheet.log 2023-07-03 21:52:43.865987675 +0900
          @@ -1,11 +1,12 @@
          -This is e-upTeX, Version 3.141592653-p4.1.0-u1.29-230214-2.6 (utf8.uptex) (TeX Live 2023) (preloaded format=uplatex 2023.5.19)  3 JUL 2023 21:25
          +This is e-upTeX, Version 3.141592653-p4.1.0-u1.29-230214-2.6 (utf8.uptex) (TeX Live 2023) (preloaded format=uplatex 2023.7.3)  3 JUL 2023 21:52
            entering extended mode
            restricted \write18 enabled.
            %&-line parsing enabled.
            **marksheet
            (./marksheet.tex
          -pLaTeX2e <2023-02-14u04>+1 (based on LaTeX2e <2022-11-01> patch level 1)
          -L3 programming layer <2023-05-15>
          +pLaTeX2e <2023-02-14u04>+1, based on
          +LaTeX2e <2023-06-01> patch level 1
          +L3 programming layer <2023-06-30>
            (/opt/texlive/2023/texmf-dist/tex/platex/jsclasses/jsarticle.cls
            Document Class: jsarticle 2023/02/23 jsclasses (okumura, texjporg)
            Class jsarticle Info: Autodetected engine: upLaTeX on input line 217.
          @@ -49,7 +50,7 @@
            \heisei=\count192
            )
            (/opt/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty
          -Package: amsmath 2022/04/08 v2.17n AMS math features
          +Package: amsmath 2023/05/13 v2.17o AMS math features
            \@mathmargin=\skip51

            For additional information on amsmath, use the `?' option.

以上です。
和田 勇 への返信

Re: マークテスト作成に当たって「marksheet.sty」の導入

- たなかな の投稿
返信が遅くなってしまいすみません。
調査ありがとうございます。
上手くいかない場合はアップデートを視野に入れます。

ご協力まことにありがとうございました。
たなかな への返信

Re: マークテスト作成に当たって「marksheet.sty」の導入

- 大熊 一弘 の投稿
> 次のエラーが出ました。
> ! Undefined control sequence.
> \@firstoffive

相互参照方式が
   あなたがお使いの LaTeX .....(L)

   marksheet.sty     .....(M)
が想定しているものとが異なっているのが原因でしょう。

現状を確認しましょう。

marksheet.tex と同じディレクトリにあるはずの marksheet.aux に,
次の2行のどちらがあるでしょう?

   \newlabel{label2}{{13}{1}} ......... (**)
   \newlabel{label2}{{13}{1}{}{}{}} .... (*****)

おそらく前者でしょうね。
それを確認してから,次に進みましょう。
大熊 一弘 への返信

Re: マークテスト作成に当たって「marksheet.sty」の導入

- たなかな の投稿
環境が職場PC内のためお返事遅くなってしまいすみません。
ご指摘の.auxファイルを確認してみました。
前者である
\newlabel{label2}{{13}{1}}
となっています。
たなかな への返信

Re: マークテスト作成に当たって「marksheet.sty」の導入

- 大熊 一弘 の投稿
> ご指摘の.auxファイルを確認してみました。
> 前者である
> \newlabel{label2}{{13}{1}}
> となっています。

わかりました。

とりあえず,エラーをなくして動かすには,
次のように marksheet.sty を修正します。

お手持ちの marksheet.sty に
\expandafter\@firstoffive#1
という語句が1か所あるはずです。それを
\expandafter\@firstoftwo#1
で置き換えます。
(five ---> two と変更)

さて,marksheet.tex はタイプセットできるようになったでしょうか?
結果は望みどおりですか?

確認報告をいただければ,
さらにもう一つの解決法をお話しする予定です。
大熊 一弘 への返信

Re: マークテスト作成に当たって「marksheet.sty」の導入

- たなかな の投稿
返信がおそくなってしまいすみません。
さっそくご指摘の個所の更新をしましたところ、
1度目は「京ア」と表示されましたが2度目は意図通り「サシ」と表示されました。
1度目の表示は式番号の\refをした時の(?.?)と同等だと考えて宜しいのでしょうか。
なにはともあれ、誠にありがとうございました。

もしよろしければ、今後の参考として
「さらにもう一つの解決法をお話しする予定です。」
というのもお聞かせいただければ幸いです。
よろしくお願いいたします。
たなかな への返信

Re: マークテスト作成に当たって「marksheet.sty」の導入

- 大熊 一弘 の投稿
> 1度目は「京ア」と表示されましたが2度目は意図通り「サシ」と表示されました。
> 1度目の表示は式番号の\refをした時の(?.?)と同等だと考えて宜しいのでしょうか。

相互参照は,複数回のタイプセットが原則ですから,
1回目の結果はシカトしましょう。

> 「さらにもう一つの解決法をお話しする予定です。」
> というのもお聞かせいただければ幸いです。

先に,相互参照方式が
   あなたがお使いの LaTeX .....(L)

   marksheet.sty     .....(M)
が想定しているものとが異なっているのが原因であると指摘しました。

前回の処理は,
   (L)には手を付けず,(M)に修正を加える
ことで整合を採ったのですが,

逆に,
   (M)には手を付けず,(L)に修正を加える
ことも可能ではあります。
すなわち texlive をバージョンアップすることです。
ただし,お勧めはしません。

TeX Wiki にも

ただし,アップデートのタイミングによっては,
今まで動いていたものが動かなくなったりすることがあるかもしれません.

とあります。

私は,主として用いるのは
  texlive 2022
です。2023 はオタメシで使うことはありますが,
最新を追うのは疲れますから,枯れてから使うようにしています。
来年には 2023 に切り替える予定です。

(L)と(M)のどちらを起てるかは,使う人の方針次第でしょうかね。
では,ご健闘を祈ります。
大熊 一弘 への返信

Re: マークテスト作成に当たって「marksheet.sty」の導入

- たなかな の投稿
アップデートも検討したのですが、そのような欠点もあるのですね。
ご協力まことにありがとうございました。