我如何将该代码包装到函数中?

我如何将该代码包装到函数中?

我有一段描述游戏中法术力量的文字。每个法术都重复以下模式:

\documentclass{article}
\begin{document}

% Template for spell powers.
\textbf{Small Heading} \\ 
\underline{0 ниво} \\   % Underlined, unindented.
\begin{itemize}
  \item{example}        % Indented bullet points.
  \item{example 2}      % Random number of bullet points.
\end{itemize}
\underline{1 ниво} \\
%\begin{itemize}        % Error when no items!
%\end{itemize}
\underline{2 ниво} \\
\underline{3 ниво} \\
\underline{4 ниво} \\
\begin{itemize}
  \item{example 3}      % Bullet points under any underlined word.
\end{itemize}
\underline{5 ниво} \\
\underline{6 ниво} \\   % Last underlined item. 

\end{document}

我希望在某个地方声明模式,然后在整个文件中使用。我希望这样可以减少输入,并且只需在一个地方更改模板。如何实现?

关于项目符号文本,请注意:(1) 带下划线的单词下可以有 0 到多个项目符号;(2) 项目符号文本长度为 20 到 200 个字符


编辑:

预期参数:

#1- 小标题 - 仅加粗。10-100 个字符
#2- #8- 0 到多个项目之间的项目化,包含 20 到 200 个字符 - 每个带下划线的单词一个

答案1

该解决方案基于egreg的一个答案:https://tex.stackexchange.com/a/136133/46716并使用xparse来自 LaTeX3 项目的功能。

它定义了一个命令\spell,该命令以分号分隔的示例作为可选参数。

\documentclass{article}
\usepackage{xparse}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}

\ExplSyntaxOn
\newcounter{spells}
\NewDocumentCommand{\spell}{o}{
    \par\noindent\underline{\thespells\ ниво}
    \stepcounter{spells}
    \IfNoValueTF{#1}{
        \par\vspace{\topsep}
    }{
        \list_examples:n{#1}
    }
}

\cs_new:Npn \list_examples:n #1{
    \seq_set_split:Nnn \splitted_seq{;}{#1}
    \begin{itemize}
        \seq_map_inline:Nn \splitted_seq{
            \item ##1
        }
    \end{itemize}
}
\ExplSyntaxOff


\begin{document}

\noindent\textbf{Small Heading}

\spell[example; example 2]
\spell
\spell
\spell
\spell[example 3]
\spell
\spell

\end{document}

编辑:对于您将整个模式包含在 1 个宏中的请求:

\documentclass{article}
\usepackage{xparse}
\usepackage{ifmtarg}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}

\ExplSyntaxOn
\makeatletter
\newcommand{\spell}[8]{
    \par\noindent\textbf{#1}
    \par\noindent\underline{0\ ниво}
    \@ifmtarg{#2}{\par\vspace{\topsep}}{\list_examples:n{#2}}
    \par\noindent\underline{1\ ниво}
    \@ifmtarg{#3}{\par\vspace{\topsep}}{\list_examples:n{#3}}
    \par\noindent\underline{2\ ниво}
    \@ifmtarg{#4}{\par\vspace{\topsep}}{\list_examples:n{#4}}
    \par\noindent\underline{3\ ниво}
    \@ifmtarg{#5}{\par\vspace{\topsep}}{\list_examples:n{#5}}
    \par\noindent\underline{4\ ниво}
    \@ifmtarg{#6}{\par\vspace{\topsep}}{\list_examples:n{#6}}
    \par\noindent\underline{5\ ниво}
    \@ifmtarg{#7}{\par\vspace{\topsep}}{\list_examples:n{#7}}
    \par\noindent\underline{6\ ниво}
    \@ifmtarg{#8}{\par\vspace{\topsep}}{\list_examples:n{#8}}
}
\makeatother

\cs_new:Npn \list_examples:n #1{
    \seq_set_split:Nnn \splitted_seq{;}{#1}
    \begin{itemize}
        \seq_map_inline:Nn \splitted_seq{
            \item ##1
        }
    \end{itemize}
}
\ExplSyntaxOff


\begin{document}

\spell{Small Heading}{example; example 2}{}{}{example 3}{}{}{}

\end{document}  

这将为您提供一个\spell包含 8 个参数的宏。第一个是标题,其他 7 个是示例。多个示例可以用分号分隔。因此

\spell{Small Heading}{example; example 2}{}{}{example 3}{}{}{}

生成:

在此处输入图片描述

相关内容