質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
TeX

フリーの組版システムで、字や図版などの要素を紙面に配置するという作業をコンピュータで行います

Q&A

解決済

1回答

349閲覧

自前マクロで展開できないコマンドのエラー

FoolHotari

総合スコア79

TeX

フリーの組版システムで、字や図版などの要素を紙面に配置するという作業をコンピュータで行います

0グッド

0クリップ

投稿2022/08/18 07:01

前提

TeXで3つの引数を取るマクロを定義しようとしています。
第2引数は必須で、第1引数と第3引数は任意です。

形式は以下の通りです。

tex

1\blank[#1]{#2}[#3]

これをdocumentブロックで使うとエラーは出ませんが、\sectionの引数の中などで使うとエラーが出ます。
エラーを出さないようにするためにはどうすればいいのでしょうか。

実現したいこと

例えば以下のように書いてもエラーが出ないようにする。

tex

1\section{\blank[#1]{#2}[#3]}

発生している問題・エラーメッセージ

33: Argument of \@sect has an extra }. <inserted text> \par l.33 \section{\blank{100pt}} Runaway argument? {\normalfont \Large \headfont \raggedright }{\@blank }\def \reserved@b \ETC. 33: Paragraph ended before \@sect was complete. <to be read again> \par l.33 \section{\blank{100pt}}

該当のソースコード

tex

1\documentclass[uplatex]{jsarticle} 2 3\makeatletter 4 5\def\blank{% 6 \@ifnextchar[{% 7 \@blank% 8 }{% 9 \@blank[]% 10 }% 11} 12 13\def\@blank[#1]#2{% 14 \@ifnextchar[{% 15 \@@blank[#1]{#2}% 16 }{% 17 \@@blank[#1]{#2}[]% 18 }% 19} 20 21\def\@@blank[#1]#2[#3]{% 22 \underline{#1\hspace{#2}#3}% 23} 24 25\makeatother 26 27\begin{document} 28 \blank{100pt} \\ 29 \blank{100pt}[suffix] \\ 30 \blank[prefix]{100pt} \\ 31 \blank[prefix]{100pt}[suffix] \\ 32\end{document}

試したこと

tex

1\section{{\blank{100pt}}}

このように波カッコで囲ってみても変わりませんでした。

tex

1\newcommand{\bbb}{\blank{100pt}} 2\section{\bbb}

このように一度マクロにまとめても変わりませんでした。

tex

1\def\temp[#1]#2[#3]{% 2 \underline{#1\hspace{#2}#3}% 3}

このように最終的な形のマクロだけ取り出して使うと、エラーは出ませんでした。

補足情報(FW/ツールのバージョンなど)

Windows10

This is ptex2pdf[.lua] version 20200520.0.
This is e-upTeX, Version 3.141592653-p3.9.0-u1.27-210218-2.6 (utf8.uptex) (TeX Live 2021/W32TeX) (preloaded format=uplatex)
\write18 enabled.
pLaTeX2e <2021-06-01u04>+2 (based on LaTeX2e <2021-11-15>)
L3 programming layer <2021-11-22> (c:/texlive/2021/texmf-dist/tex/platex/jsclasses/jsarticle.cls
Document Class: jsarticle 2021/06/28 jsclasses (okumura, texjporg)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

\section 内で使うときは \protect を付ける必要があるようです。

LaTeX

1\section{\protect\blank{100pt}}

xparse を使って定義する別解もありそうです。

LaTeX

1\documentclass[uplatex]{jsarticle} 2\usepackage{xparse} 3\NewDocumentCommand{\blank}{o m o}{% 4 \IfValueTF{#1}{% 5 \IfValueTF{#3}{% 6 \underline{#1\hspace{#2}#3}% 7 }{% 8 \underline{#1\hspace{#2}}% 9 } 10 }{% 11 \IfValueTF{#3}{% 12 \underline{\hspace{#2}#3}% 13 }{% 14 \underline{\hspace{#2}}% 15 } 16 } 17} 18\begin{document} 19 20\section{\blank{100pt}} 21 22 \blank{100pt} \\ 23 \blank{100pt}[suffix] \\ 24 \blank[prefix]{100pt} \\ 25 \blank[prefix]{100pt}[suffix] \\ 26\end{document}

投稿2022/08/19 04:20

nekotail

総合スコア128

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FoolHotari

2022/08/19 06:01

回答ありがとうございます。完全に解決いたしました。 xparseパッケージとは知りませんでしたが、とても便利そうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問