\documentclass[luatex,fontsize=8pt,paper=b5,twoside]{jlreq}% \usepackage{luwa-ul} \usepackage{hyperref} \usepackage{caption} \usepackage[most]{tcolorbox} \usepackage{fp} \usepackage{lltjext} \usepackage{luatexja-ruby} \usepackage{KKsymbols} \usepackage{KKran} \usepackage{amsmath,amssymb} \usepackage{listings} \lstset{ basicstyle=\ttfamily\small, keywordstyle=\color{blue}, commentstyle=\color{gray}, stringstyle=\color{red}, breaklines=true, breakatwhitespace=false, columns=flexible } % You can omit these font settings. \RequirePackage[no-math]{fontspec} \RequirePackage[no-math,match,scale=1]{luatexja-fontspec} \RequirePackage[hiragino-pro,deluxe,expert]{luatexja-preset} \setmainfont{HiraMinPro-W3}[BoldFont=HiraMinPro-W6]\setmainjfont{HiraMinPro-W3}[BoldFont=HiraMinPro-W6] \renewfontfamily{\sffamily}{HiraKakuPro-W3}[BoldFont=HiraKakuPro-W6] \renewfontfamily{\mcfamily}{HiraMinPro-W3}[BoldFont=HiraMinPro-W6] \renewfontfamily{\gtfamily}{HiraKakuPro-W3}[BoldFont=HiraKakuPro-W6] \providefontfamily{\mgfamily}{HiraMaruPro-W4} \newfontfamily{\sfhira}{HiraKakuPro-W3}[BoldFont=HiraKakuPro-W6]\newjfontfamily{\sfhiraj}{HiraKakuPro-W3}[BoldFont=HiraKakuPro-W6] \newfontfamily{\mchira}{HiraMinPro-W3}[BoldFont=HiraMinPro-W6]\newjfontfamily{\mchiraj}{HiraMinPro-W3}[BoldFont=HiraMinPro-W6] \newfontfamily{\gthira}{HiraKakuPro-W3}[BoldFont=HiraKakuPro-W6,FontFace={eb}{\shapedefault}{HiraKakuStd-W8}]\newjfontfamily{\gthiraj}{HiraKakuPro-W3}[BoldFont=HiraKakuPro-W6,FontFace={eb}{\shapedefault}{HiraKakuStd-W8}] \newfontfamily{\mghira}{HiraMaruPro-W4}\newjfontfamily{\mghiraj}{HiraMaruPro-W4} \renewcommand{\sffamily}{\sfhira\sfhiraj} \renewcommand{\mcfamily}{\mchira\mchiraj} \renewcommand{\gtfamily}{\gthira\gthiraj} \renewcommand{\mgfamily}{\mghira\mghiraj} %%% \usepackage{hyperref} \hypersetup{ luatex, pdfencoding=auto, colorlinks=true, linkcolor=black, citecolor=black, urlcolor=DeepSkyBlue3, pdfborder={0 0 0}, } \colorlet{grayLight}{white!80!black} \NewTCBListing{SourceCode}{ O{Input} m !o !O{DeepSkyBlue3} }{% enhanced, colback=black!70, colframe=Snow4, toptitle=-1mm, bottomtitle=-1mm, righttitle=-1mm, lefttitle=-1mm, arc=.5mm, title={\tcbox[on line, arc=.5mm, boxsep=0pt, boxrule=0pt, top=1mm, bottom=0.8mm, left=2mm, right=2.2mm, colback=gray!80, coltext=white]{\raisebox{-0.1ex}{\vphantom{羅}\vphantom{j}#1}}},fonttitle=\gtfamily\footnotesize,boxrule=0.8pt, breakable,before upper={\color{white}},top=-0.5mm,bottom=-0.5mm, after title=\IfNoValueTF{#3}{}{{\hfill\tcbox[on line, arc=.5mm, boxsep=0pt, boxrule=0pt, top=1mm, bottom=0.8mm, left=2mm, right=2.2mm, colback=white!80!black, coltext=#4]{\raisebox{-0.1ex}{\vphantom{羅}\vphantom{j}#3}}}}, listing only, listing options={ language={#2}, basicstyle=\ttfamily, keywordstyle=\ttfamily\color{white}, stringstyle=\itshape\color{white}, commentstyle=\small\gtfamily\color{DeepSkyBlue2}, showspaces=false,showtabs=false, breaklines=true,breakindent=0pt, showstringspaces=false, columns=fullflexible, tabsize=2, numbers=left,numbersep=1.5pt, numberstyle=\scriptsize\gtfamily\color{gray}, } } \NewTColorBox{OutPut}{ m !o !O{DeepSkyBlue3} }{% enhanced, colframe=Snow4, toptitle=-1mm, bottomtitle=-1mm, righttitle=-1mm, lefttitle=-1mm, arc=.5mm, colback=white, title={\tcbox[on line, arc=.5mm, boxsep=0pt, boxrule=0pt, top=1mm, bottom=0.8mm, left=2mm, right=2.2mm, colback=gray!40, coltext=DeepSkyBlue3]{\raisebox{-0.1ex}{\vphantom{羅}\vphantom{j}#1}}},fonttitle=\gtfamily\footnotesize,boxrule=0.8pt, breakable,top=-0.5mm,bottom=-0.5mm, after title=\IfNoValueTF{#2}{}{{\hfill\tcbox[on line, arc=.5mm, boxsep=0pt, boxrule=0pt, top=1mm, bottom=0.8mm, left=2mm, right=2.2mm, colback=white!80!black, coltext=#3]{\raisebox{-0.1ex}{\vphantom{羅}\vphantom{j}#2}}}}, bottom=2mm, top=2mm, } \title{\texttt{KKran} Package Documentation} \author{Kosei Kawaguchi a.k.a. KKTeX} \date{Version 1.0.0 (2025/11/23)} \begin{document} \begin{titlepage} \maketitle \end{titlepage} \newpage \tableofcontents \newpage \section{Outline in English} This is a package that offers commands for generating answer fields used in tests and exams. It is compatible with both vertical and horizontal text formatting. Using Lua and tikz, I made it possible to generate answer-boxes very easily. By the way, the naming may seem a bit odd, but the package name comes from ``欄 (ran)'' meaning ``a small space.'' I hope this package will be helpful to you. \section{はじめに} このパッケージは、オーソドックスなフォーマットの解答欄を作成するためのコマンドを提供するパッケージです。横書きと縦書きの両方に対応しています。内部的にLuaの構文を使用しているので、\namiKK{LuaLaTeX限定}です。 本パッケージによって、以下のような解答欄を作成することが可能です。サンプルのソースコードは本マニュアル末のセクションにあります。 \begin{center} \includegraphics[width=.9\columnwidth]{kkran-sample.pdf} \end{center} \section{依存性} 内部的に読み込むパッケージは \begin{itemize} \item calc, tikz \item xcolor, KKsymbols \item kvoptions, luacode \end{itemize} \noindent となります。 \section{設置・オプション} しかるべき場所に\texttt{KKran.sty}が置かれている下で、\verb|\usepackage[オプション]{KKran}|により読み込みます。 パッケージオプションは \begin{description} \item[kaitouhyouji] 解答欄上に模範解答を出力するか否かを指定します。"0"なら出力せず、"1"なら出力します。デフォルトは1です。 \item[kaitoucolor] 模範解答の文字の色を指定します。デフォルトはredです。 \item[gridmax] マス目を出力するコマンドである\verb|\小問マス目| において、1行当たりの最大マス目数を指定します。デフォルトは20です。 \item[nongridmax] 記述解答欄を出力するコマンドである\verb|\小問記述| において、1行当たりの最大マス目数を指定します。ただし、このコマンドではマス目は可視化されません。デフォルトは20です。 \item[unit] 本パッケージでは「マス目単位で」各解答欄の位置を制御します。その際の1マスの幅を指定するのがこのオプションです。デフォルトは\verb|2\zw|です。 \item[wakuwidth] 解答欄の枠線の太さを指定します。デフォルトは\verb|.7pt|です。 \item[tensenwakuwidth] 欄の一部に使われている点線部分の太さを指定します。デフォルトは\verb|.7pt|です。 \item[tensenon] 欄の一部に使われている点線部分のdash-patternを決めるためのもので、線の最小単位の長さを指定できます。デフォルトは\verb|.5pt|です。 \item[tensenoff] 欄の一部に使われている点線部分のdash-patternを決めるためのもので、最小単位の配置間隔を指定できます。デフォルトは\verb|.7pt|です。 \item[clsadjust] jlreqクラス以外を指定する場合は、\verb|clsadjust=1|を指定します。デフォルトは0です。ただし、内部的には、\verb|clsadjust=1|の時に \begin{lstlisting} \RequirePackage[scale=1]{luatexja-fontspec} \RequirePackage[deluxe,expert]{luatexja-preset} \end{lstlisting} \noindent を読み込むという処理をしているため、より詳細にこれらのオプションを設定したい場合には\verb|clsadjust=0|とし、適宜設定をしてください。 \end{description} \section{使い方} \subsection{\textbackslash KKran} このパッケージを使って解答欄を出力する場合、解答欄は\verb|\KKran[オプション]{引数}|の\verb|{引数}|に入れていくという形をとります。 \begin{SourceCode}{TeX} \KKran[解答欄の外枠を囲む線の太さ]{引数}[ナンバリングのオプション] \end{SourceCode} \noindent という構文です。 ナンバリングのオプションとは、番号をどの形式で進めるかを指定するもので、 \begin{SourceCode}{TeX} \KKran[解答欄の外枠を囲む線の太さ]{引数}[% daimon=いろは, shoumon=一 ] \end{SourceCode} \noindent のような書き方をします。それぞれ何も指定しない場合は、アラビア数字でカウントされますが、そうでないカウント方法を取りたい場合、以下の選択肢から選ぶことになります。 \begin{description} \item[daimon] a, A, あ, ア, いろは, イロハ, 一, ロ小, ロ大を取れる。それぞれ、abc\dots, ABC\dots, あいう\dots, アイウ\dots, いろは\dots, イロハ\dots, 一二三\dots, \Rrnum{1} \ \Rrnum{2} \ \Rrnum{3}\dots, \Rrnum*{1} \ \Rrnum*{2} \ \Rrnum*{3}\dots というカウント形式です。 \item[shoumon] 上に同じです。 \end{description} \subsection{小問} 小問を構成する際は、\verb|\小問番号|で番号を、\verb|\小問欄|と\verb|\小問中欄|で欄をつけるという形です。 \begin{SourceCode}{TeX} % 構文 \小問番号[横幅]{縦幅}[番号] % デフォルト % 横幅:.5 % 番号:アラビア数字(\kakkoに入っている) % 使用例 \KKran{% \小問番号[1]{2}\小問番号{2}[A]\小問番号{2}[B]\小問番号[1]{2}\小問番号[1]{2} } \end{SourceCode} \noindent が基本構文です。 出力は \begin{OutPut}{Output} \KKran{% \小問番号[1]{2}\小問番号{2}[A]\小問番号{2}[B]\小問番号[1]{2}\小問番号[1]{2} } \end{OutPut} \noindent のようになります。 第3引数を指定しない場合、小問番号のカウンタは自動で進みますが、ここを手動で書いた場合はカウンタが進みません。 カウンタを強制的にある値にしたい場合には、\verb|\SetShoumon{99}|のように変更できるようにしてあります。 また、当然ながら大問が変わると値はリセットされます(大問の分け方は後述)。 ここに、\verb|\小問欄|および\verb|小問中欄|を組み合わせます。 \begin{SourceCode}{TeX} % 構文 \小問欄{横幅}{縦幅}[欄内記入] \小問中欄{横幅}{縦幅}[欄内記入] % デフォルト % 欄内記入:空集合 % 使用例 \KKran{% \小問番号{2}\小問中欄{3}{2}\小問中欄{3}{2}\小問欄{4}{2}[south east={$\mathrm{mm}$}, west={$x=$}]\小問番号{2}\小問欄{4}{2} } \end{SourceCode} \begin{OutPut}{Output} \KKran{% \小問番号{2}\小問中欄{3}{2}\小問中欄{3}{2}\小問欄{4}{2}[south east={$\mathrm{mm}$}, west={$x=$}]\小問番号{2}\小問欄{4}{2} } \end{OutPut} 基本的には\verb|\小問欄|を使いますが、同一の小問内で複数解答欄を用意する時などは、最後の欄以外を\verb|\小問中欄|にしても良いでしょう。 欄内記入に関して、オプションとしてcenter,east,west,north east, north west, south east, south westをとることができ、各key名に対応する箇所をアンカーポイントとしてその引数が出力されます。tikzにおけるnodeのオプションと全く同様です。 引数には何を挿入してもよく、図表も挿入可能です。 \begin{SourceCode}{TeX} \KKran{ \小問番号{6}\小問欄{8}{6}[center={% \begin{tabular}{|l|c|r|} \hline 列1 & 列2 & 列3 \\ \hline データA & 100 & 5.5 \\ \hline データB & 200 & 9.8 \\ \hline データC & 300 & 12.3 \\ \hline \end{tabular} }] \小問番号{6}\小問欄{9}{6}[center={% \begin{tikzpicture} \draw[->] (0, -.3) -- (0, 2.5) node[above] {$y$}; \draw[->] (-2, 0) -- (2, 0) node[right] {$x$}; \filldraw (0, 0) circle (.5pt) node[below left] {$\mathrm{O}$}; \draw[domain=-1.5:1.5, samples=100, thick] plot (\x, {\x*\x}); \end{tikzpicture} }] } \end{SourceCode} \begin{OutPut}{Output} \KKran{ \小問番号{6}\小問欄{8}{6}[center={% \begin{tabular}{|l|c|r|} \hline 列1 & 列2 & 列3 \\ \hline データA & 100 & 5.5 \\ \hline データB & 200 & 9.8 \\ \hline データC & 300 & 12.3 \\ \hline \end{tabular} }] \小問番号{6}\小問欄{9}{6}[center={% \begin{tikzpicture} \draw[->] (0, -.3) -- (0, 2.5) node[above] {$y$}; \draw[->] (-2, 0) -- (2, 0) node[right] {$x$}; \filldraw (0, 0) circle (.5pt) node[below left] {$\mathrm{O}$}; \draw[domain=-1.5:1.5, samples=100, thick] plot (\x, {\x*\x}); \end{tikzpicture} }] } \end{OutPut} \subsection{模範解答入力} 模範解答を入力する場合、その部分を\verb|\KaitouInput{引数}|によって入力しておくと、パッケージオプションである\texttt{kaitouhyouji}が1の時だけ表示されるようになります。ただし、この効果は\verb|\color|コマンドによる色の変更が可能な範囲に限ります。 tikzの描画も当然解答として入力可能ですが、 \begin{SourceCode}{TeX} \KKran{ \小問番号{6}\小問欄{9}{6}[center={\KaitouInput{% \begin{tikzpicture} \draw[->] (0, -.3) -- (0, 2.5) node[above] {$y$}; \draw[->] (-2, 0) -- (2, 0) node[right] {$x$}; \filldraw (0, 0) circle (.5pt) node[below left] {$\mathrm{O}$}; \draw[domain=-1.5:1.5, samples=100, thick, blue] plot (\x, {\x*\x}); % ここ! \end{tikzpicture} }}] } \end{SourceCode} \begin{OutPut}{Output} \KKran{ \小問番号{6}\小問欄{9}{6}[center={\KaitouInput{% \begin{tikzpicture} \draw[->] (0, -.3) -- (0, 2.5) node[above] {$y$}; \draw[->] (-2, 0) -- (2, 0) node[right] {$x$}; \filldraw (0, 0) circle (.5pt) node[below left] {$\mathrm{O}$}; \draw[domain=-1.5:1.5, samples=100, thick, blue] plot (\x, {\x*\x}); % ここ! \end{tikzpicture} }}] } \end{OutPut} のように明示的に色を指定した場合、そこだけは\verb|\KaitouInput|の効果範囲外となることに注意しましょう。 \section{大問ごとの組み方} 大問を組むとなる場合、\verb|\大問番号|というコマンドで番号をつけ、段ごとに\verb|\小問欄|などを並べていきます。段をずらす際には\verb|\GoDown|というコマンドを使用していきます。 \begin{SourceCode}{TeX} % 構文 \大問番号[横幅]{縦幅}[番号] % デフォルト % 横幅:.5 % 番号:アラビア数字(\kakkoに入っている) \GoDown{下に降りたいマス目数} % 使用例 \KKran[3pt]{% \大問番号[1]{9} \小問番号{2}\小問欄{2}{2}\小問番号{2}\小問欄{4}{2}\GoDown{2} \小問番号{4}\小問欄{8}{4}\GoDown{4} \小問番号{3}\小問欄{3}{3}\小問番号{3}\小問欄{2}{3} }[shoumon=いろは,daimon=ア] \end{SourceCode} \begin{OutPut}{Output} \KKran[3pt]{% \大問番号[1]{9} \小問番号{2}\小問欄{2}{2}\小問番号{2}\小問欄{4}{2}\GoDown{2} \小問番号{4}\小問欄{8}{4}\GoDown{4} \小問番号{3}\小問欄{3}{3}\小問番号{3}\小問欄{2}{3} }[shoumon=いろは,daimon=ア] \end{OutPut} 大問番号をある値にしたいという場合、\verb|\SetDaimon{99}|のように指定します。 \section{記述解答欄} 記述問題専用の解答欄として、マス目ありのもの、なしのものの2種類の解答欄を用意しています。 注意点として、\verb|\linewidth|を上回る横幅を解答欄が占めるような組み方をしてはならないというものがあります。エラーにはなりませんが、大問と大問との間隔が余計に1行分大きくなってしまいます。 \begin{SourceCode}{TeX} % 構文 \小問マス目[文字数下限]{文字数上限}[欄内記入] \小問記述{文字数上限}[欄内記入] % デフォルト % 文字数下限:文字数上限と同じ値 % 欄内記入:空集合 % 使用例 \KKran[3pt]{% \大問番号[1]{7} \小問番号{1}\小問マス目[4]{6}\GoDown{1} \小問番号{2}\小問記述{40}\GoDown{2} \小問番号{4}\小問マス目[50]{75} } \end{SourceCode} \begin{OutPut}{Output} \KKran[3pt]{% \大問番号[1]{7} \小問番号{1}\小問マス目[4]{6}\GoDown{1} \小問番号{2}\小問記述{40}\GoDown{2} \小問番号{4}\小問マス目[50]{75} } \end{OutPut} また、ここに模範解答を入力する際は半角英数字や約物を全角1マスに適切に拡大縮小するため、必要に応じて\verb|\ichimoji|というコマンド(\texttt{KKsymbols}パッケージが提供していますが、本パッケージは内部的に\texttt{KKsymbols}パッケージを読み込むため使用可能です。)を使用します。 \begin{SourceCode}{TeX} % 使用例 \KKran[3pt]{% \大問番号[1]{3} \小問番号{1}\小問マス目[4]{6}[\KaitouInput{\ichimoji{12}\ichimoji{3}番目\ichimoji{。}}]\GoDown{1} \小問番号{2}\小問マス目{40}[\KaitouInput{\ichimoji{「}日本に\ichimoji{Ma}\ichimoji{tt}\ichimoji{he}\ichimoji{w\phantom{w}}=\ichimoji{Pe}\ichimoji{rr}\ichimoji{y\phantom{y}}提督が来たから。\ichimoji{」}という話であります。}] } \end{SourceCode} \begin{OutPut}{Output} \KKran[3pt]{% \大問番号[1]{3} \小問番号{1}\小問マス目[4]{6}[\KaitouInput{\ichimoji{12}\ichimoji{3}番目\ichimoji{。}}]\GoDown{1} \小問番号{2}\小問マス目{40}[\KaitouInput{\ichimoji{「}日本に\ichimoji{Ma}\ichimoji{tt}\ichimoji{he}\ichimoji{w\phantom{w}}=\ichimoji{Pe}\ichimoji{rr}\ichimoji{y\phantom{y}}提督が来たから。\ichimoji{」}という話であります。}] } \end{OutPut} \section{マークシート} マークシートの作り方は、\verb|\MarkArrayMake|でひとまず必要な配列を作成しておき、\verb|\マークシート|コマンドで配置します。 \begin{SourceCode}{TeX} % 構文 \MarkArrayMake{配列名}{|要素1|要素2|...|要素n|} \マークシート{配置幅}{配列格納}[正解番号] % 使用例 \MarkArrayMake{テストA}{|$\pm$|0|1|2|3|} \MarkArrayMake{テストB}{|ア|イ|ウ|エ|オ|} \KKran[3pt]{% \大問番号[1]{8} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストAマーク配列}[4]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストAマーク配列}[1]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストAマーク配列}[4]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストBマーク配列}[3]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストBマーク配列}[2]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストBマーク配列}[3]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストBマーク配列}[4]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストBマーク配列}[3]]\GoDown{1} }[shoumon=一,daimon=ア] \end{SourceCode} \begin{OutPut}{Output} \MarkArrayMake{テストA}{|$\pm$|0|1|2|3|} \MarkArrayMake{テストB}{|ア|イ|ウ|エ|オ|} \KKran[3pt]{% \大問番号[1]{8} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストAマーク配列}[4]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストAマーク配列}[1]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストAマーク配列}[4]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストBマーク配列}[3]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストBマーク配列}[2]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストBマーク配列}[3]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストBマーク配列}[4]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストBマーク配列}[3]]\GoDown{1} }[shoumon=一,daimon=ア] \end{OutPut} \verb|\マークシート{配置幅}{配列格納}[正解番号]|の第3引数で指定した番号を$n \in \mathbb{N}$として、作成した配列の$n$番目が黒く塗られる仕様となっており、模範解答の入力はこれで行います。\verb|kaitouhyouji=0|の時は塗られず、\verb|kaitouhyouji=1|のときにのみ黒く塗った部分が表示されます。 \section{サンプル} \begin{SourceCode}{TeX} \documentclass{jlreq} \usepackage[kaitouhyouji=1,gridmax=20,kaitoucolor=red]{KKran} \begin{document} \KKran{% \大問番号{9} \小問番号{2}\小問欄{2}{2}[center=\KaitouInput{ア}]\小問番号{2}\小問中欄{5}{2}[west=人物:,center=\KaitouInput{松尾},east=芭蕉]\小問欄{6}{2}[west=作品:,center=\KaitouInput{奥の細道}]\GoDown{2} \小問番号{2}\小問欄{4}{2}[center=\KaitouInput{つわもの}]\小問番号{2}\小問欄{2}{2}[center=\KaitouInput{ウ}]\小問番号{2}\小問欄{2}{2}[center=\KaitouInput{エ}] \小問番号{2}\小問欄{4}{2}[center=\KaitouInput{片雲の風}] \小問番号{2}\小問欄{5}{2}[center=\KaitouInput{春夜宴桃李園序}]\GoDown{2} \小問番号{4}\小問マス目[45]{65}[\KaitouInput{李白の著名な詩を元にした\ichimoji{「}月日は百代の過客\ichimoji{」}という表現を引いて旅に主題を仄めかしつつ\ichimoji{、}滑らかにに自身の紀行文に主眼を移す役割\ichimoji{。}}]\GoDown{4} \小問番号{1}\小問マス目{7}[\KaitouInput{道祖神の招き}]% }[shoumon=一,daimon=ア] \bigskip \KKran{% \大問番号{7}\小問番号{2}\小問欄{3}{2}[center=\KaitouInput{144}]\小問番号{2}\小問欄{4}{2}[south east={$\mathrm{mm}$},center=\KaitouInput{$3.0$}, west={$x=$}]\GoDown{2} \小問番号{5}\小問欄{8}{5}[center={\KaitouInput{% \begin{tikzpicture} \draw[domain=-1.5:1.5, samples=100, thick] plot (\x, {\x*\x}); \draw[->,, black] (0, -.3) -- (0, 2.5) node[above] {$y$}; \draw[->,, black] (-2, 0) -- (2, 0) node[right] {$x$}; \filldraw[black] (0, 0) circle (.5pt) node[below left] {$\mathrm{O}$}; \end{tikzpicture}}}] }[shoumon=一,daimon=ア] \bigskip \MarkArrayMake{テストA}{|$\pm$|0|1|2|3|} \MarkArrayMake{テストB}{|ア|イ|ウ|エ|オ|} \KKran{% \大問番号{8} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストAマーク配列}[4]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストAマーク配列}[1]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストAマーク配列}[4]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストBマーク配列}[3]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストBマーク配列}[2]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストBマーク配列}[3]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストBマーク配列}[4]]\GoDown{1} \小問番号{1}\小問欄{6}{1}[center=\マークシート{5}{\テストBマーク配列}[3]]\GoDown{1} }[shoumon=一,daimon=ア] \end{document} \end{SourceCode} \begin{OutPut}{Output} \begin{center} \includegraphics[width=.7\columnwidth]{kkran-sample.pdf} \end{center} \end{OutPut} \section{ライセンス} \noindent Released under the MIT License. \noindent Copyright (c) 2025 Kosei Kawaguchi \noindent Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \noindent The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. \noindent THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \section{Version History} \begin{itemize} \item \textbf{v1.0.0 (2025/11/23)} --- Initial public release. \end{itemize} \section{Source Code} \begin{lstlisting} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{KKran}[2025/11/23, Version 1.0.0] \RequirePackage{calc} \RequirePackage{tikz} \RequirePackage{xcolor} \RequirePackage{KKsymbols} \usetikzlibrary{shapes} \usetikzlibrary{calc} \RequirePackage{kvoptions} \RequirePackage{luacode} \SetupKeyvalOptions{% family=kkran,% prefix=kkran@% } \DeclareStringOption[1]{kaitouhyouji} \DeclareStringOption[red]{kaitoucolor} \DeclareStringOption[20]{gridmax} \DeclareStringOption[20]{nongridmax} \DeclareStringOption[2\zw]{unit} \DeclareStringOption[.7pt]{wakuwidth} \DeclareStringOption[.35pt]{tensenwakuwidth} \DeclareStringOption[.5pt]{tensenon} \DeclareStringOption[.7pt]{tensenoff} \DeclareStringOption[0]{clsadjust} \ProcessKeyvalOptions* \ifnum\number\kkran@clsadjust=1 \RequirePackage[scale=1]{luatexja-fontspec} \RequirePackage[deluxe,expert]{luatexja-preset} \else \ifnum\number\kkran@clsadjust=0 \else \errmessage{Error: clsadjust option requires to be 0 or 1.}% \fi \fi \NewDocumentCommand{\KaitouInput}{m}{% \ifnum\number\kkran@kaitouhyouji=1 {\color{\kkran@kaitoucolor}#1}% \else \ifnum\number\kkran@kaitouhyouji=0 {\color{white}#1}% \else \errmessage{Error: kaitouhyouji option requires to be 0 or 1.}% \fi% \fi% } \newdimen\width@KKran \width@KKran=\kkran@unit \newdimen\waku@KKran \waku@KKran=\kkran@wakuwidth \newdimen\tensenwaku@KKran \tensenwaku@KKran =\kkran@tensenwakuwidth \def\modai@bangou@wd{0.5} \def\mondai@position@tmp{0} \def\mondai@position@y@tmp{0} \def\mondai@dash@pat@on{\kkran@tensenon} \def\mondai@dash@pat@off{\kkran@tensenoff} \newcount\NUM@mondai \newcount\NUM@shoumon % 縦書きの時のみ仕様\kakko{\RevBangou{あ}}みたいに \NewDocumentCommand{\RevBangou}{m}{% \ifnum\ltjgetparameter{direction}=3% \rotatebox[origin=c]{-90}{#1}% \else% #1% \fi% } % カウンタを設定するため \NewDocumentCommand{\SetDaimon}{m}{\NUM@mondai=#1} \NewDocumentCommand{\SetShoumon}{m}{\NUM@shoumon=#1} \NewDocumentCommand{\daimon@bangou@yokotate}{}{% \ifnum\ltjgetparameter{direction}=3% \def\rotate@or@not@daimon{90} \else \def\rotate@or@not@daimon{0}% \fi% } \NewDocumentCommand{\how@to@count@daimon@bangou}{}{% \number\NUM@mondai% } \NewDocumentCommand{\Daimon@Box@A@N}{ O{.5} m o }{% 大問番号 \daimon@bangou@yokotate% \IfNoValueTF{#3}{\global\advance\NUM@mondai by 1}{}% \global\def\modai@bangou@wd{#1}% \draw[line width=\waku@KKran] (0,0) rectangle (#1\width@KKran,- #2\width@KKran);% \node[anchor=center,overlay ,rotate=\rotate@or@not@daimon ] at (.5*#1\width@KKran,- .5*#2\width@KKran) {\scalebox{.8}{\IfNoValueTF{#3}{\kakko{\how@to@count@daimon@bangou}}{#3}}}; \pgfmathparse{\mondai@position@tmp + \modai@bangou@wd}% \edef\mondai@position@tmp{\pgfmathresult}% } \NewDocumentCommand{\shoumon@bangou@yokotate}{}{% \ifnum\ltjgetparameter{direction}=3% \def\rotate@or@not@shoumon{90} \else \def\rotate@or@not@shoumon{0}% \fi% } \NewDocumentCommand{\how@to@count@shoumon@bangou}{}{% \number\NUM@shoumon% } \NewDocumentCommand{\Shoumon@Box@A@N}{ O{.5} m o }{% 小問番号 \shoumon@bangou@yokotate \IfNoValueTF{#3}{\advance\NUM@shoumon by 1}{}% \draw[line width=\waku@KKran] (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) -- ++ (0,- #2\width@KKran); \draw[line width=\waku@KKran] (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) -- ++ (#1\width@KKran,0); \draw[line width=\tensenwaku@KKran, dash pattern=on \mondai@dash@pat@on off \mondai@dash@pat@off] (\mondai@position@tmp\width@KKran+#1\width@KKran,-\mondai@position@y@tmp\width@KKran) -- ++ (0,- #2\width@KKran); \draw[line width=\waku@KKran] (\mondai@position@tmp\width@KKran+#1\width@KKran,-\mondai@position@y@tmp\width@KKran- #2\width@KKran) -- ++ (-#1\width@KKran,0); \node[anchor=center,overlay ,rotate=\rotate@or@not@shoumon ] at (\mondai@position@tmp\width@KKran+.5*#1\width@KKran,-\mondai@position@y@tmp\width@KKran- .5*#2\width@KKran) {\scalebox{.8}{\IfNoValueTF{#3}{\kakko{\how@to@count@shoumon@bangou}}{#3}}}; \pgfmathparse{\mondai@position@tmp + #1}% \edef\mondai@position@tmp{\pgfmathresult}% } \define@key{Shoumon@Box@A}{west}{% \def\westtext@Shoumon@Box@A{#1}% } \define@key{Shoumon@Box@A}{center}{% \def\centertext@Shoumon@Box@A{#1}% } \define@key{Shoumon@Box@A}{east}{% \def\easttext@Shoumon@Box@A{#1}% } \define@key{Shoumon@Box@A}{north west}{% \def\nwtext@Shoumon@Box@A{#1}% } \define@key{Shoumon@Box@A}{north east}{% \def\netext@Shoumon@Box@A{#1}% } \define@key{Shoumon@Box@A}{south west}{% \def\swtext@Shoumon@Box@A{#1}% } \define@key{Shoumon@Box@A}{south east}{% \def\setext@Shoumon@Box@A{#1}% } \NewDocumentCommand{\reset@Shoumon@Box@A}{}{% \def\westtext@Shoumon@Box@A{}% \def\centertext@Shoumon@Box@A{}% \def\easttext@Shoumon@Box@A{}% \def\nwtext@Shoumon@Box@A{}% \def\netext@Shoumon@Box@A{}% \def\swtext@Shoumon@Box@A{}% \def\setext@Shoumon@Box@A{}% } \NewDocumentCommand{\Shoumon@Box@A}{ m m O{} }{% 小問 \reset@Shoumon@Box@A\setkeys{Shoumon@Box@A}{#3}% % 左上から反時計回りに A, B, C, D を定義 \path (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) coordinate (A@Shoumon@Box@A) -- ++(0,-#2\width@KKran) coordinate (B@Shoumon@Box@A) -- ++(#1\width@KKran,0) coordinate (C@Shoumon@Box@A) -- ++(0,#2\width@KKran) coordinate (D@Shoumon@Box@A); % 箱の描画 \draw[line width=\tensenwaku@KKran, dash pattern=on \mondai@dash@pat@on off \mondai@dash@pat@off] (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) -- ++ (0,- #2\width@KKran); \draw[line width=\waku@KKran] (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) -- ++ (#1\width@KKran,0) -- ++ (0,- #2\width@KKran) -- ++ (-#1\width@KKran,0); % 文字列などの挿入用 \node[overlay,anchor=center] at ($(A@Shoumon@Box@A)!0.5!(C@Shoumon@Box@A)$) {\centertext@Shoumon@Box@A}; \node[overlay,anchor=west] at ($(A@Shoumon@Box@A)!0.5!(B@Shoumon@Box@A)$) {\westtext@Shoumon@Box@A}; \node[overlay,anchor=east] at ($(C@Shoumon@Box@A)!0.5!(D@Shoumon@Box@A)$) {\easttext@Shoumon@Box@A}; \node[overlay,anchor=north west] at (A@Shoumon@Box@A) {\nwtext@Shoumon@Box@A}; \node[overlay,anchor=north east] at (D@Shoumon@Box@A) {\netext@Shoumon@Box@A}; \node[overlay,anchor=south west] at (B@Shoumon@Box@A) {\swtext@Shoumon@Box@A}; \node[overlay,anchor=south east] at (C@Shoumon@Box@A) {\setext@Shoumon@Box@A}; % 座標の更新 \pgfmathparse{\mondai@position@tmp + #1}% \edef\mondai@position@tmp{\pgfmathresult}% } \define@key{Shoumon@Box@B}{west}{% \def\westtext@Shoumon@Box@B{#1}% } \define@key{Shoumon@Box@B}{center}{% \def\centertext@Shoumon@Box@B{#1}% } \define@key{Shoumon@Box@B}{east}{% \def\easttext@Shoumon@Box@B{#1}% } \define@key{Shoumon@Box@B}{north west}{% \def\nwtext@Shoumon@Box@B{#1}% } \define@key{Shoumon@Box@B}{north east}{% \def\netext@Shoumon@Box@B{#1}% } \define@key{Shoumon@Box@B}{south west}{% \def\swtext@Shoumon@Box@B{#1}% } \define@key{Shoumon@Box@B}{south east}{% \def\setext@Shoumon@Box@B{#1}% } \NewDocumentCommand{\reset@Shoumon@Box@B}{}{% \def\westtext@Shoumon@Box@B{}% \def\centertext@Shoumon@Box@B{}% \def\easttext@Shoumon@Box@B{}% \def\nwtext@Shoumon@Box@B{}% \def\netext@Shoumon@Box@B{}% \def\swtext@Shoumon@Box@B{}% \def\setext@Shoumon@Box@B{}% } \NewDocumentCommand{\Shoumon@Box@B}{ m m O{} }{% 小問(右が点線に) \reset@Shoumon@Box@B\setkeys{Shoumon@Box@B}{#3}% % 左上から反時計回りに A, B, C, D を定義 \path (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) coordinate (A@Shoumon@Box@B) -- ++(0,-#2\width@KKran) coordinate (B@Shoumon@Box@B) -- ++(#1\width@KKran,0) coordinate (C@Shoumon@Box@B) -- ++(0,#2\width@KKran) coordinate (D@Shoumon@Box@B); % 箱の描画 \draw[line width=\tensenwaku@KKran, dash pattern=on \mondai@dash@pat@on off \mondai@dash@pat@off] (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) -- ++ (0,- #2\width@KKran); \draw[line width=\waku@KKran] (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) -- ++ (#1\width@KKran,0); \draw[line width=\tensenwaku@KKran, dash pattern=on \mondai@dash@pat@on off \mondai@dash@pat@off] (\mondai@position@tmp\width@KKran+#1\width@KKran,-\mondai@position@y@tmp\width@KKran) -- ++ (0,- #2\width@KKran); \draw[line width=\waku@KKran] (\mondai@position@tmp\width@KKran+#1\width@KKran,-\mondai@position@y@tmp\width@KKran- #2\width@KKran) -- ++ (-#1\width@KKran,0); % 文字列などの挿入用 \node[overlay,anchor=center] at ($(A@Shoumon@Box@B)!0.5!(C@Shoumon@Box@B)$) {\centertext@Shoumon@Box@B}; \node[overlay,anchor=west] at ($(A@Shoumon@Box@B)!0.5!(B@Shoumon@Box@B)$) {\westtext@Shoumon@Box@B}; \node[overlay,anchor=east] at ($(C@Shoumon@Box@B)!0.5!(D@Shoumon@Box@B)$) {\easttext@Shoumon@Box@B}; \node[overlay,anchor=north west] at (A@Shoumon@Box@B) {\nwtext@Shoumon@Box@B}; \node[overlay,anchor=north east] at (D@Shoumon@Box@B) {\netext@Shoumon@Box@B}; \node[overlay,anchor=south west] at (B@Shoumon@Box@B) {\swtext@Shoumon@Box@B}; \node[overlay,anchor=south east] at (C@Shoumon@Box@B) {\setext@Shoumon@Box@B}; % 座標の更新 \pgfmathparse{\mondai@position@tmp + #1}% \edef\mondai@position@tmp{\pgfmathresult}% } \newcommand{\masume@text@KKran}[1]{% \begingroup% \ltjsetparameter{kanjiskip=0pt}% \ltjsetparameter{xkanjiskip=0pt}% \setlength{\baselineskip}{\dimexpr\unit@KKran\relax}% \fontsize{\unit@KKran}{\baselineskip}\selectfont% {#1}% \setlength{\lineskiplimit}{-99mm}% \par% \endgroup% } \newdimen\unit@KKran \unit@KKran=\kkran@unit \NewDocumentCommand{\Shoumon@Grid@A}{ O{#2} m O{} }{% \def\grid@max@A{#2}\def\grid@min@A{#1}% \ifnum\grid@max@A<\grid@min@A% 大小がおかしい時はerror \errmessage{Error: \grid@max@A (\the\grid@max@A) must be greater than or equal to \grid@min@A (\the\grid@min@A).}% \fi% \def\grid@x@A{\kkran@gridmax}% 可変にしてもいい \pgfmathtruncatemacro{\shou@grid@max@A}{\grid@max@A / \grid@x@A}% \pgfmathtruncatemacro{\amari@grid@max@A}{mod(\grid@max@A,\grid@x@A)}% \pgfmathtruncatemacro{\max@minus@amari@grid@max@A}{\grid@x@A-\amari@grid@max@A}% \pgfmathtruncatemacro{\shou@grid@min@A}{\grid@min@A / \grid@x@A}% \pgfmathtruncatemacro{\amari@grid@min@A}{mod(\grid@min@A,\grid@x@A)}% \pgfmathtruncatemacro{\min@minus@amari@grid@min@A}{\grid@x@A-\amari@grid@min@A}% \ifnum\grid@min@A<\grid@x@A% minの方の描画 \draw[overlay,line width=\waku@KKran] (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\unit@KKran) -- (\mondai@position@tmp\width@KKran+\amari@grid@min@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\unit@KKran); \draw[overlay,line width=\waku@KKran] (\mondai@position@tmp\width@KKran+\amari@grid@min@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\unit@KKran) -- (\mondai@position@tmp\width@KKran+\amari@grid@min@A\unit@KKran,-\mondai@position@y@tmp\width@KKran+\shou@grid@min@A\unit@KKran); \draw[overlay,line width=\waku@KKran] (\mondai@position@tmp\width@KKran+\amari@grid@min@A\unit@KKran,-\mondai@position@y@tmp\width@KKran+\shou@grid@min@A\unit@KKran) -- (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran); \else \ifnum\amari@grid@min@A=0% 余り0の方 \draw[overlay,line width=\waku@KKran] (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@min@A\unit@KKran) -- (\mondai@position@tmp\width@KKran+\grid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@min@A\unit@KKran); \draw[overlay,line width=\waku@KKran] (\mondai@position@tmp\width@KKran+\grid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@min@A\unit@KKran) -- (\mondai@position@tmp\width@KKran+\grid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran); \draw[overlay,line width=\waku@KKran] (\mondai@position@tmp\width@KKran+\grid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran) -- (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran); \else% 余り\neq0の方 \coordinate (A@amari@non@zero) at (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran);% \coordinate (B@amari@non@zero) at (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@min@A\unit@KKran-\unit@KKran);% \coordinate (C@amari@non@zero) at (\mondai@position@tmp\width@KKran+\amari@grid@min@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@min@A\unit@KKran-\unit@KKran);% \coordinate (D@amari@non@zero) at (\mondai@position@tmp\width@KKran+\amari@grid@min@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@min@A\unit@KKran);% \coordinate (E@amari@non@zero) at (\mondai@position@tmp\width@KKran+\grid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@min@A\unit@KKran);% \coordinate (F@amari@non@zero) at (\mondai@position@tmp\width@KKran+\grid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran);% \draw[overlay,line width=\waku@KKran] (B@amari@non@zero) -- (C@amari@non@zero); \draw[overlay,line width=\waku@KKran] (C@amari@non@zero) -- (D@amari@non@zero); \draw[overlay,line width=\waku@KKran] (D@amari@non@zero) -- (E@amari@non@zero); \draw[overlay,line width=\waku@KKran] (E@amari@non@zero) -- (F@amari@non@zero); \draw[overlay,line width=\waku@KKran] (F@amari@non@zero) -- (A@amari@non@zero); \fi \fi \ifnum\grid@max@A<\grid@x@A% maxの方の描画 % 垂直線(左端除去) \foreach \x in {1,2,...,\amari@grid@max@A} { \draw[dashed,line width=\tensenwaku@KKran] ($(\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) + (\x\unit@KKran,0)$) -- ++(0,-\unit@KKran); } \draw[line width=\tensenwaku@KKran, dash pattern=on \mondai@dash@pat@on off \mondai@dash@pat@off] (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) -- (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\unit@KKran); \draw[line width=\waku@KKran] (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\unit@KKran) -- % 1. 底辺の始点 (左下の角) (\mondai@position@tmp\width@KKran+\amari@grid@max@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\unit@KKran) -- % 2. 底辺の終点 (右下の角) (\mondai@position@tmp\width@KKran+\amari@grid@max@A\unit@KKran,-\mondai@position@y@tmp\width@KKran+\shou@grid@max@A\unit@KKran) -- % 3. 右の縦の辺 (右上の角) (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran+\shou@grid@max@A\unit@KKran); % 4. 上辺の終点 (左上の角) \node[anchor=north west,inner sep=0pt] at (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran+\shou@grid@max@A\unit@KKran) {\masume@text@KKran{#3}};% 最後に文字 \pgfmathparse{\mondai@position@tmp + \grid@max@A}% \edef\mondai@position@tmp{\pgfmathresult}% \else \ifnum\amari@grid@max@A=0% 余り0の方 % 座標の短縮 \coordinate (P@amarizero) at (\mondai@position@tmp\width@KKran, -\mondai@position@y@tmp\width@KKran); \def\H{\shou@grid@max@A\unit@KKran} % 垂直線(左端除去) \foreach \x in {1,2,...,\grid@x@A} { \draw[dashed,line width=\tensenwaku@KKran] ($(P@amarizero) + (\x\unit@KKran,0)$) -- ++(0,-\shou@grid@max@A\unit@KKran); } % 水平線 \foreach \y in {0,1,...,\shou@grid@max@A} { \draw[dashed,line width=\tensenwaku@KKran] ($(P@amarizero) + (0,-\y\unit@KKran)$) -- ++(\grid@x@A\unit@KKran,0); } \draw[line width=\tensenwaku@KKran, dash pattern=on \mondai@dash@pat@on off \mondai@dash@pat@off] (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) -- (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@max@A\unit@KKran); \draw[line width=\waku@KKran] (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@max@A\unit@KKran) -- % 始点 A (\mondai@position@tmp\width@KKran+\grid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@max@A\unit@KKran) -- % 終点 B (\mondai@position@tmp\width@KKran+\grid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran) -- % 終点 C (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran); % 終点 D \node[anchor=north west,inner sep=0pt] at (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) {\parbox{\grid@x@A\unit@KKran}{\masume@text@KKran{#3}}};% 最後に文字 \else% 余り\neq0の方 \coordinate (A@amari@non@zero) at (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran);% \coordinate (B@amari@non@zero) at (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@max@A\unit@KKran-\unit@KKran);% \coordinate (C@amari@non@zero) at (\mondai@position@tmp\width@KKran+\amari@grid@max@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@max@A\unit@KKran-\unit@KKran);% \coordinate (D@amari@non@zero) at (\mondai@position@tmp\width@KKran+\amari@grid@max@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@max@A\unit@KKran);% \coordinate (E@amari@non@zero) at (\mondai@position@tmp\width@KKran+\grid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@max@A\unit@KKran);% \coordinate (F@amari@non@zero) at (\mondai@position@tmp\width@KKran+\grid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran);% % 垂直線(左端除去) \foreach \x in {1,2,...,\amari@grid@max@A} {% 左ブロック \draw[dashed,line width=\tensenwaku@KKran] ($(A@amari@non@zero) + (\x\unit@KKran,0)$) -- ++(0,-\shou@grid@max@A\unit@KKran-\unit@KKran); } \foreach \x in {1,2,...,\max@minus@amari@grid@max@A} {% 右ブロック \draw[dashed,line width=\tensenwaku@KKran] ($(D@amari@non@zero) + (\x\unit@KKran,0)$) -- ++(0,\shou@grid@max@A\unit@KKran); } % 水平線 \foreach \y in {0,1,...,\shou@grid@max@A} {% 左ブロック \draw[dashed,line width=\tensenwaku@KKran] ($(A@amari@non@zero) + (0,-\y\unit@KKran)$) -- ++(\amari@grid@max@A\unit@KKran,0); } \foreach \y in {0,1,...,\shou@grid@max@A} {% 右ブロック \draw[dashed,line width=\tensenwaku@KKran] ($(D@amari@non@zero) + (0,\y\unit@KKran)$) -- ++(\max@minus@amari@grid@max@A\unit@KKran,0); } \draw[line width=\tensenwaku@KKran, dash pattern=on \mondai@dash@pat@on off \mondai@dash@pat@off] (A@amari@non@zero) -- (B@amari@non@zero); \draw[line width=\waku@KKran] (B@amari@non@zero) -- (C@amari@non@zero) -- (D@amari@non@zero) -- (E@amari@non@zero) -- (F@amari@non@zero) -- (A@amari@non@zero); \node[anchor=north west,inner sep=0pt] at (A@amari@non@zero) {\parbox{\grid@x@A\unit@KKran}{\masume@text@KKran{#3}}};% 最後に文字 \fi \pgfmathparse{\mondai@position@tmp + \grid@x@A}% \edef\mondai@position@tmp{\pgfmathresult}% \fi } \NewDocumentCommand{\Shoumon@NonGrid@A}{ m O{} }{% \def\nongrid@max@A{#1}% \def\nongrid@x@A{20}% 可変にしてもいい \pgfmathtruncatemacro{\shou@nongrid@max@A}{\nongrid@max@A / \nongrid@x@A}% \pgfmathtruncatemacro{\amari@nongrid@max@A}{mod(\nongrid@max@A,\nongrid@x@A)}% \pgfmathtruncatemacro{\max@minus@amari@nongrid@max@A}{\nongrid@x@A-\amari@nongrid@max@A}% \ifnum\nongrid@max@A<\nongrid@x@A% maxの方の描画のみ \draw[line width=\tensenwaku@KKran, dash pattern=on \mondai@dash@pat@on off \mondai@dash@pat@off] (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) -- (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\unit@KKran); \draw[line width=\waku@KKran] (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\unit@KKran) -- % 1. 底辺の始点 (左下の角) (\mondai@position@tmp\width@KKran+\amari@nongrid@max@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\unit@KKran) -- % 2. 底辺の終点 (右下の角) (\mondai@position@tmp\width@KKran+\amari@nongrid@max@A\unit@KKran,-\mondai@position@y@tmp\width@KKran+\shou@nongrid@max@A\unit@KKran) -- % 3. 右の縦の辺 (右上の角) (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran+\shou@nongrid@max@A\unit@KKran); % 4. 上辺の終点 (左上の角) \node[anchor=north west,inner sep=0pt] at (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran+\shou@nongrid@max@A\unit@KKran) {\masume@text@KKran{#2}};% 最後に文字 \pgfmathparse{\mondai@position@tmp + \nongrid@max@A}% \edef\mondai@position@tmp{\pgfmathresult}% \else \ifnum\amari@nongrid@max@A=0% 余り0の方 % 座標の短縮 \coordinate (P@amarizero) at (\mondai@position@tmp\width@KKran, -\mondai@position@y@tmp\width@KKran); \def\H{\shou@nongrid@max@A\unit@KKran} % 水平線 \foreach \y in {0,1,...,\amari@nongrid@max@A} { \draw[dashed,line width=\tensenwaku@KKran] ($(P@amarizero) + (0,-\y\unit@KKran)$) -- ++(\nongrid@x@A\unit@KKran,0); } \draw[line width=\tensenwaku@KKran, dash pattern=on \mondai@dash@pat@on off \mondai@dash@pat@off] (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) -- (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\shou@nongrid@max@A\unit@KKran); \draw[line width=\waku@KKran] (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\shou@nongrid@max@A\unit@KKran) -- % 始点 A (\mondai@position@tmp\width@KKran+\nongrid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@nongrid@max@A\unit@KKran) -- % 終点 B (\mondai@position@tmp\width@KKran+\nongrid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran) -- % 終点 C (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran); % 終点 D \node[anchor=north west,inner sep=0pt] at (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) {\parbox{\nongrid@x@A\unit@KKran}{\masume@text@KKran{#2}}};% 最後に文字 \else% 余り\neq0の方 \coordinate (A@amari@non@zero) at (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran);% \coordinate (B@amari@non@zero) at (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\shou@nongrid@max@A\unit@KKran-\unit@KKran);% \coordinate (C@amari@non@zero) at (\mondai@position@tmp\width@KKran+\amari@nongrid@max@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@nongrid@max@A\unit@KKran-\unit@KKran);% \coordinate (D@amari@non@zero) at (\mondai@position@tmp\width@KKran+\amari@nongrid@max@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@nongrid@max@A\unit@KKran);% \coordinate (E@amari@non@zero) at (\mondai@position@tmp\width@KKran+\nongrid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@nongrid@max@A\unit@KKran);% \coordinate (F@amari@non@zero) at (\mondai@position@tmp\width@KKran+\nongrid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran);% % 水平線 \foreach \y in {0,1,...,\shou@nongrid@max@A} {% 上ブロック \draw[dashed,line width=\tensenwaku@KKran] ($(A@amari@non@zero) + (0,-\y\unit@KKran)$) -- ++(\nongrid@x@A\unit@KKran,0); } \draw[dashed,line width=\tensenwaku@KKran]% 下ブロック ($(D@amari@non@zero) + (0,\shou@nongrid@max@A\unit@KKran)$) -- ++(\max@minus@amari@nongrid@max@A\unit@KKran,0); \draw[line width=\tensenwaku@KKran, dash pattern=on \mondai@dash@pat@on off \mondai@dash@pat@off] (A@amari@non@zero) -- (B@amari@non@zero); \draw[line width=\waku@KKran] (B@amari@non@zero) -- (C@amari@non@zero) -- (D@amari@non@zero) -- (E@amari@non@zero) -- (F@amari@non@zero) -- (A@amari@non@zero); \node[anchor=north west,inner sep=0pt] at (A@amari@non@zero) {\parbox{\nongrid@x@A\unit@KKran}{\masume@text@KKran{#2}}};% 最後に文字 \fi \pgfmathparse{\mondai@position@tmp + \nongrid@x@A}% \edef\mondai@position@tmp{\pgfmathresult}% \fi } \NewDocumentCommand{\GoDown}{m}{% 下へ行く \pgfmathparse{\mondai@position@y@tmp + #1}% \edef\mondai@position@y@tmp{\pgfmathresult}% \def\mondai@position@tmp{0}% \pgfmathparse{\mondai@position@tmp + \modai@bangou@wd}% \edef\mondai@position@tmp{\pgfmathresult}% } % 1.外枠と中身を黒塗り 2.中身を白抜き 3.本体の描画 \newcommand{\BlockFillMode@KKran}{% % 1. カウンターが進まないようにローカル化(または無効化) % 2. 各ボックス描画コマンドを「矩形塗りつぶし(\fill)」に再定義 % \Daimon@Box@A@N のパッチ \RenewDocumentCommand{\Daimon@Box@A@N}{ O{.5} m O{} }{% \global\def\modai@bangou@wd{##1}% \fill (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) rectangle ++(##1\width@KKran, -##2\width@KKran);% \pgfmathparse{\mondai@position@tmp + \modai@bangou@wd}% \edef\mondai@position@tmp{\pgfmathresult}% }% % Shoumon@Box@A@N のパッチ \RenewDocumentCommand{\Shoumon@Box@A@N}{ O{.5} m O{} }{% \fill (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) rectangle ++(##1\width@KKran, -##2\width@KKran);% \pgfmathparse{\mondai@position@tmp + ##1}% \edef\mondai@position@tmp{\pgfmathresult}% }% % Shoumon@Box@A のパッチ \RenewDocumentCommand{\Shoumon@Box@A}{ m m O{} }{% \fill (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) rectangle ++(##1\width@KKran, -##2\width@KKran);% \pgfmathparse{\mondai@position@tmp + ##1}% \edef\mondai@position@tmp{\pgfmathresult}% }% \RenewDocumentCommand{\Shoumon@Box@B}{ m m O{} }{% \fill (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) rectangle ++(##1\width@KKran, -##2\width@KKran);% \pgfmathparse{\mondai@position@tmp + ##1}% \edef\mondai@position@tmp{\pgfmathresult}% }% % Shoumon@Grid@A/NonGrid@A \RenewDocumentCommand{\Shoumon@Grid@A}{ O{##2} m O{}}{% \def\grid@max@A{##2}\def\grid@min@A{##1}% \def\grid@x@A{\kkran@gridmax}% 可変にしてもいい \pgfmathtruncatemacro{\shou@grid@max@A}{\grid@max@A / \grid@x@A}% \pgfmathtruncatemacro{\amari@grid@max@A}{mod(\grid@max@A,\grid@x@A)}% \pgfmathtruncatemacro{\max@minus@amari@grid@max@A}{\grid@x@A-\amari@grid@max@A}% \pgfmathtruncatemacro{\shou@grid@min@A}{\grid@min@A / \grid@x@A}% \pgfmathtruncatemacro{\amari@grid@min@A}{mod(\grid@min@A,\grid@x@A)}% \pgfmathtruncatemacro{\min@minus@amari@grid@min@A}{\grid@x@A-\amari@grid@min@A}% \ifnum\grid@max@A<\grid@x@A \fill (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\unit@KKran) -- % 1. 底辺の始点 (左下の角) (\mondai@position@tmp\width@KKran+\amari@grid@max@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\unit@KKran) -- % 2. 底辺の終点 (右下の角) (\mondai@position@tmp\width@KKran+\amari@grid@max@A\unit@KKran,-\mondai@position@y@tmp\width@KKran+\shou@grid@max@A\unit@KKran) -- % 3. 右の縦の辺 (右上の角) (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran+\shou@grid@max@A\unit@KKran) -- cycle; % 4. 上辺の終点 (左上の角) \else \ifnum\amari@grid@max@A=0 \fill (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@max@A\unit@KKran) -- % 始点 A (\mondai@position@tmp\width@KKran+\grid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@max@A\unit@KKran) -- % 終点 B (\mondai@position@tmp\width@KKran+\grid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran) -- % 終点 C (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) -- cycle; % 終点 D \else \coordinate (A@amari@non@zero) at (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran);% \coordinate (B@amari@non@zero) at (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@max@A\unit@KKran-\unit@KKran);% \coordinate (C@amari@non@zero) at (\mondai@position@tmp\width@KKran+\amari@grid@max@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@max@A\unit@KKran-\unit@KKran);% \coordinate (D@amari@non@zero) at (\mondai@position@tmp\width@KKran+\amari@grid@max@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@max@A\unit@KKran);% \coordinate (E@amari@non@zero) at (\mondai@position@tmp\width@KKran+\grid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@grid@max@A\unit@KKran);% \coordinate (F@amari@non@zero) at (\mondai@position@tmp\width@KKran+\grid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran);% \fill (B@amari@non@zero) -- (C@amari@non@zero) -- (D@amari@non@zero) -- (E@amari@non@zero) -- (F@amari@non@zero) -- (A@amari@non@zero) -- cycle; \fi \fi } \RenewDocumentCommand{\Shoumon@NonGrid@A}{ m O{}}{% \def\nongrid@max@A{##1} \def\nongrid@x@A{20}% 可変にしてもいい \pgfmathtruncatemacro{\shou@nongrid@max@A}{\nongrid@max@A / \nongrid@x@A}% \pgfmathtruncatemacro{\amari@nongrid@max@A}{mod(\nongrid@max@A,\nongrid@x@A)}% <-- grid を nongrid に変更 \pgfmathtruncatemacro{\max@minus@amari@nongrid@max@A}{\nongrid@x@A-\amari@nongrid@max@A}% \ifnum\nongrid@max@A<\nongrid@x@A \fill (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\unit@KKran) -- % 1. 底辺の始点 (左下の角) (\mondai@position@tmp\width@KKran+\amari@nongrid@max@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\unit@KKran) -- % 2. 底辺の終点 (右下の角) (\mondai@position@tmp\width@KKran+\amari@nongrid@max@A\unit@KKran,-\mondai@position@y@tmp\width@KKran+\shou@nongrid@max@A\unit@KKran) -- % 3. 右の縦の辺 (右上の角) (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran+\shou@nongrid@max@A\unit@KKran) -- cycle; % 4. 上辺の終点 (左上の角) \pgfmathparse{\mondai@position@tmp + \nongrid@max@A}% \edef\mondai@position@tmp{\pgfmathresult}% \else \ifnum\amari@nongrid@max@A=0 \fill (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\shou@nongrid@max@A\unit@KKran) -- % 始点 A (\mondai@position@tmp\width@KKran+\nongrid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@nongrid@max@A\unit@KKran) -- % 終点 B (\mondai@position@tmp\width@KKran+\nongrid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran) -- % 終点 C (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran) -- cycle; % 終点 D \pgfmathparse{\mondai@position@tmp + \nongrid@x@A}% \edef\mondai@position@tmp{\pgfmathresult}% \else \coordinate (A@amari@non@zero) at (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran);% \coordinate (B@amari@non@zero) at (\mondai@position@tmp\width@KKran,-\mondai@position@y@tmp\width@KKran-\shou@nongrid@max@A\unit@KKran-\unit@KKran);% \coordinate (C@amari@non@zero) at (\mondai@position@tmp\width@KKran+\amari@nongrid@max@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@nongrid@max@A\unit@KKran-\unit@KKran);% \coordinate (D@amari@non@zero) at (\mondai@position@tmp\width@KKran+\amari@nongrid@max@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@nongrid@max@A\unit@KKran);% \coordinate (E@amari@non@zero) at (\mondai@position@tmp\width@KKran+\nongrid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran-\shou@nongrid@max@A\unit@KKran);% \coordinate (F@amari@non@zero) at (\mondai@position@tmp\width@KKran+\nongrid@x@A\unit@KKran,-\mondai@position@y@tmp\width@KKran);% \fill (B@amari@non@zero) -- (C@amari@non@zero) -- (D@amari@non@zero) -- (E@amari@non@zero) -- (F@amari@non@zero) -- (A@amari@non@zero) -- cycle; \pgfmathparse{\mondai@position@tmp + \nongrid@x@A}% \edef\mondai@position@tmp{\pgfmathresult}% \fi \fi } } \ExplSyntaxOn % アルファベット \seq_set_split:Nnn \g_alphabet_lower_seq {} {abcdefghijklmnopqrstuvwxyz} \seq_set_split:Nnn \g_alphabet_upper_seq {} {ABCDEFGHIJKLMNOPQRSTUVWXYZ} \NewDocumentCommand{\alphabetarray}{ s m }{% \IfBooleanTF{#1} {\seq_item:Nn \g_alphabet_upper_seq {#2}} % *あり:大文字 {\seq_item:Nn \g_alphabet_lower_seq {#2}} % *なし:小文字 } % ローマ数字 \NewDocumentCommand{\Rrnum}{ s m }{% \IfBooleanTF{#1}{\uppercase\expandafter{\romannumeral#2}}{\romannumeral#2}% } % 50音 \seq_set_split:Nnn \g_gojyuon_hira_seq {} {あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん} \seq_set_split:Nnn \g_gojyuon_kata_seq {} {アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン} \NewDocumentCommand{\gojyuon}{ s m }{% \IfBooleanTF{#1}{\seq_item:Nn \g_gojyuon_kata_seq {#2}} {\seq_item:Nn \g_gojyuon_hira_seq {#2}} } % いろはうた \seq_set_split:Nnn \g_iroha_seq {}{いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす} \seq_set_split:Nnn \g_irohakata_seq {}{イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス } \NewDocumentCommand{\iroha}{ s m }{% \IfBooleanTF{#1}{\seq_item:Nn \g_irohakata_seq {#2}}{\seq_item:Nn \g_iroha_seq {#2}} } % 漢数字 \int_new:N \wabunkansuji_tmpa_int \int_new:N \wabunkansuji_tmpb_int \int_new:N \wabunkansuji_tmpc_int \cs_new:Npn \wabunkansuji_one:n #1 { \int_case:nnF {#1} { {1}{一}{2}{二}{3}{三}{4}{四}{5}{五}{6}{六}{7}{七}{8}{八}{9}{九} }{} } \cs_new:Npn \wabunkansuji_main:n #1 { \int_compare:nNnTF {#1} = {0} {零} { \int_compare:nNnTF {#1} = {10000} {一万} { % 万の位 \int_set:Nn \wabunkansuji_tmpa_int { \int_div_truncate:nn {#1} {10000} } \int_set:Nn \wabunkansuji_tmpb_int { #1 - \wabunkansuji_tmpa_int * 10000 } \int_compare:nNnTF \wabunkansuji_tmpa_int > 0 { \wabunkansuji_one:n{\wabunkansuji_tmpa_int}万 }{} % 千の位 \int_set:Nn \wabunkansuji_tmpa_int { \int_div_truncate:nn \wabunkansuji_tmpb_int {1000} } \int_set:Nn \wabunkansuji_tmpc_int { \wabunkansuji_tmpb_int - \wabunkansuji_tmpa_int * 1000 } \int_compare:nNnTF \wabunkansuji_tmpa_int = 0 {} { \int_compare:nNnTF \wabunkansuji_tmpa_int = 1 {千}{\wabunkansuji_one:n{\wabunkansuji_tmpa_int}千} } % 百の位 \int_set:Nn \wabunkansuji_tmpa_int { \int_div_truncate:nn \wabunkansuji_tmpc_int {100} } \int_set:Nn \wabunkansuji_tmpb_int { \wabunkansuji_tmpc_int - \wabunkansuji_tmpa_int * 100 } \int_compare:nNnTF \wabunkansuji_tmpa_int = 0 {} { \int_compare:nNnTF \wabunkansuji_tmpa_int = 1 {百}{\wabunkansuji_one:n{\wabunkansuji_tmpa_int}百} } % 十の位 \int_set:Nn \wabunkansuji_tmpa_int { \int_div_truncate:nn \wabunkansuji_tmpb_int {10} } \int_set:Nn \wabunkansuji_tmpc_int { \wabunkansuji_tmpb_int - \wabunkansuji_tmpa_int * 10 } \int_compare:nNnTF \wabunkansuji_tmpa_int = 0 {} { \int_compare:nNnTF \wabunkansuji_tmpa_int = 1 {十}{\wabunkansuji_one:n{\wabunkansuji_tmpa_int}十} } % 一の位 \int_compare:nNnTF \wabunkansuji_tmpc_int = 0 {} {\wabunkansuji_one:n{\wabunkansuji_tmpc_int}} } } } \NewDocumentCommand{\wabunkansuji}{ m }{\wabunkansuji_main:n{#1}} \ExplSyntaxOff \pgfkeys{ /KKran/.is family, /KKran/.cd, daimon/.is choice, daimon/a/.code={% \def\how@to@count@daimon@bangou{\slowcare{\alphabetarray{\number\NUM@mondai}}}% }, daimon/A/.code={% \def\how@to@count@daimon@bangou{\alphabetarray*{\number\NUM@mondai}}% }, daimon/あ/.code={% \def\how@to@count@daimon@bangou{\RevBangou{\gojyuon{\number\NUM@mondai}}}% }, daimon/ア/.code={% \def\how@to@count@daimon@bangou{\RevBangou{\gojyuon*{\number\NUM@mondai}}}% }, daimon/いろは/.code={% \def\how@to@count@daimon@bangou{\RevBangou{\iroha{\number\NUM@mondai}}}% }, daimon/イロハ/.code={% \def\how@to@count@daimon@bangou{\RevBangou{\iroha*{\number\NUM@mondai}}}% }, daimon/一/.code={% \def\how@to@count@daimon@bangou{\RevBangou{\wabunkansuji{\number\NUM@mondai}}}% }, daimon/ロ小/.code={% \def\how@to@count@daimon@bangou{\Rrnum{\number\NUM@mondai}}% }, daimon/ロ大/.code={% \def\how@to@count@daimon@bangou{\Rrnum*{\number\NUM@mondai}}% }, shoumon/.is choice, shoumon/a/.code={% \def\how@to@count@shoumon@bangou{\slowcare{\alphabetarray{\number\NUM@shoumon}}}% }, shoumon/A/.code={% \def\how@to@count@shoumon@bangou{\alphabetarray*{\number\NUM@shoumon}}% }, shoumon/あ/.code={% \def\how@to@count@shoumon@bangou{\RevBangou{\gojyuon{\number\NUM@shoumon}}}% }, shoumon/ア/.code={% \def\how@to@count@shoumon@bangou{\RevBangou{\gojyuon*{\number\NUM@shoumon}}}% }, shoumon/いろは/.code={% \def\how@to@count@shoumon@bangou{\RevBangou{\iroha{\number\NUM@shoumon}}}% }, shoumon/イロハ/.code={% \def\how@to@count@shoumon@bangou{\RevBangou{\iroha*{\number\NUM@shoumon}}}% }, shoumon/一/.code={% \def\how@to@count@shoumon@bangou{\RevBangou{\wabunkansuji{\number\NUM@shoumon}}}% }, shoumon/ロ小/.code={% \def\how@to@count@shoumon@bangou{\Rrnum{\number\NUM@shoumon}}% }, shoumon/ロ大/.code={% \def\how@to@count@shoumon@bangou{\Rrnum*{\number\NUM@shoumon}}% }, } \NewDocumentCommand{\KKran}{ O{2pt} m O{} }{% \begingroup% % 第3引数(#3)のキー設定を適用 \pgfkeys{/KKran/.cd, #3}% % 描画内容をマクロとして定義(3回使い回す) \def\byouga@KKran{% #2% } \begin{tikzpicture} % 1. 黒の太線シルエット(背景) % BlockFillModeでコマンドを「塗りつぶし」に変え、カウンターをリセットしてから描画 \begin{scope}[line width=#1, line join=round] \BlockFillMode@KKran % fillだけでなくdrawも行うことで外側に太らせる \tikzset{every path/.style={draw=black, fill=black}} \byouga@KKran \end{scope} % 2. 白のシルエット(中抜き用) % 線の太さを0にして、純粋な形状だけで黒い塊の内側をくり抜く \begin{scope} \BlockFillMode@KKran \tikzset{every path/.style={fill=white, draw=none}} \byouga@KKran \end{scope} % 3. 本番の描画(前面) \begin{scope} \byouga@KKran \end{scope} \end{tikzpicture} \endgroup% } % 名前をユーザー用に切り替え \let\大問番号\Daimon@Box@A@N \let\小問番号\Shoumon@Box@A@N \let\小問欄\Shoumon@Box@A \let\小問中欄\Shoumon@Box@B \let\小問マス目\Shoumon@Grid@A \let\小問記述\Shoumon@NonGrid@A % マークシート % ひとまずKKsymbolsの書き方で楕円を作る \newlength{\oval@boxwidth} \newlength{\oval@textwidth} \newlength{\oval@textheight} \newcommand{\VerticalAdjustOval}{% \ifnum\ltjgetparameter{direction}=3 -0.17ex % 縦組 \else 0.19ex % 横組 \fi } \DeclareRobustCommand{\kyouteoval}[1]{% \settowidth{\oval@textwidth}{#1}% \settoheight{\oval@textheight}{#1}% \setlength{\oval@boxwidth}{\f@size pt}% \ltjghostbeforejachar% \vphantom{羅}\raisebox{\VerticalAdjustOval}{% \hbox to \oval@boxwidth{% \hss \tikz[baseline=(char.base)]{% \node[ shape=ellipse, line width=0.15ex, minimum height=.9\oval@boxwidth, minimum width=.55\oval@boxwidth, draw, inner sep=0pt ] (char){% \raisebox{0.165ex}{\scalebox{0.6}{\vphantom{羅}\makebox[.75\oval@boxwidth][c]{\maybescale{\oval@textwidth}{.6\oval@boxwidth}{\maybescaleV{\oval@textheight}{1.03\oval@boxwidth}{#1}}}}}% }; }% \hss }% }% \ltjghostafterjachar } \DeclareRobustCommand{\kyouteovalblack@KKran@internal}[1]{% \settowidth{\oval@textwidth}{#1}% \settoheight{\oval@textheight}{#1}% \setlength{\oval@boxwidth}{\f@size pt}% \ltjghostbeforejachar% \vphantom{羅}\raisebox{\VerticalAdjustOval}{% \hbox to \oval@boxwidth{% \hss \tikz[baseline=(char.base)]{% \node[ shape=ellipse, line width=0.15ex, minimum height=.9\oval@boxwidth, minimum width=.55\oval@boxwidth, draw, fill=black!70, inner sep=0pt ] (char){% \raisebox{0.165ex}{\scalebox{0.6}{\vphantom{羅}\makebox[.75\oval@boxwidth][c]{\maybescale{\oval@textwidth}{.6\oval@boxwidth}{\maybescaleV{\oval@textheight}{1.03\oval@boxwidth}{#1}}}}}% }; }% \hss }% }% \ltjghostafterjachar } \ifnum\number\kkran@kaitouhyouji=1 % \let\kyouteovalblack\kyouteovalblack@KKran@internal% \else% \let\kyouteovalblack\kyouteoval% \fi% \begin{luacode*} -- 配列データを保存するグローバルテーブル stored_arrays = {} function register_mark_array(name, input_str) local items = {} -- パイプ区切りで要素を取得してLuaテーブルに保存 for s in string.gmatch(input_str, "[^|]+") do table.insert(items, s) end stored_arrays[name] = items -- TeXマクロを定義 -- \解答マーク配列[n] の形式で呼び出せるようにする (デフォルトは0) -- 内部で render_mark_array を呼び出す tex.print("\\expandafter\\newcommand\\csname " .. name .. "マーク配列\\endcsname[1][0]{" .. "\\directlua{render_mark_array('" .. name .. "', #1)}}") end function render_mark_array(name, active_index) local items = stored_arrays[name] local output = {} local target = tonumber(active_index) for i, val in ipairs(items) do if i == target then -- 指定されたインデックスなら黒丸 table.insert(output, "\\kyouteovalblack{" .. val .. "}") else -- それ以外は白丸 table.insert(output, "\\kyouteoval{" .. val .. "}") end end -- \hfill で結合してTeXに出力 tex.print(table.concat(output, "\\hfill ")) end \end{luacode*} % 配列作成マクロ \newcommand{\MarkArrayMake}[2]{% \directlua{register_mark_array("\luaescapestring{#1}", "\luaescapestring{#2}")}% } % マークシート表示マクロ % 第3引数(オプション)があれば、内部のマクロ(#2)にその引数を渡す % \MarkArrayMake{解答}{|ア|イ|ウ|エ|オ|}で配列作成 % \小問欄{6}{1}[center={\マークシート{5}{\解答マーク配列}}]で使う \NewDocumentCommand{\マークシート}{ m m o }{% \makebox[#1\unit@KKran]{% \usefont{T1}{phv}{m}{n}% \IfNoValueTF{#3}{% #2% 引数なし(すべて白) }{% #2[#3]% 引数あり(指定箇所を黒く) }% }% } \endinput \end{lstlisting} \end{document}