我有一段描述游戏中法术力量的文字。每个法术都重复以下模式:
\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}{}{}{}
生成: