我正在编写一个测试宏来评估不同字母和不同大小(线条)的 Lettrine 参数。场景如下:
- 主程序调用一个参数宏来测试给定字母的 Lettrine:
\TestLettrine{A}
- 该
\TestLettrine
宏调用另一个宏来获取正确的选项,并将字母和大小(行号)传递给 Lettrine\LettrineOpts{A}{3}
:。
当我编译它时(我正在使用 LuaLatex)我收到消息:
! Argument of \xs_IfStringCase_ii has an extra }.
<inserted text>
\par
l.179 \TestLettrine{A}
在 Overleaf 上运行它时出现了更多错误,包括此处提到的错误。
这是我的 MWE:
\documentclass{article}
\usepackage{lettrine}
\usepackage{xstring}
\usepackage{lipsum}
\newcommand{\LettrineOpts}[2]{%
\IfStrEqCase{#1}{%
{A}{lines=#2,lraise=0.1,slope=0.6em}%
{C}{lines=#2,findent=0.1em,nindent=0.18em,slope=-0.5em}
}%
}%
\newcommand{\TestLettrine}[1]{%
\providecommand{\opts}{\LettrineOpts{#1}{3}}
Opts for char #1 and size 3:\\ \opts
\lettrine[\opts]{#1}{}3 lines (\opts). One liner.
\let\opts\relax
\vspace*{3ex}
\providecommand{\opts}{\LettrineOpts{#1}{4}}
Opts for char #1 and size 4:\\ \opts
\lettrine[\opts]{#1}{}4 lignes. \\ \lipsum
\let\opts\relax
\vspace*{3ex}
}%
\begin{document}
\TestLettrine{A} \par
\TestLettrine{C}
% covering all the letters
\end{document}
答案1
您的代码产生了另一个错误,并且不允许我播放尺寸变化(lines=n)。
与此同时,我找到了另一个我将要采用的解决方案。它使用 Lettrine 配置文件,我可以在其中定义我想要的每个字符的选项。我最初认为定义大小会覆盖这些定义。事实并非如此。Lettrine 将我的选项与配置文件中已有的选项合并。
丹尼尔·弗利波 (Daniel Flipo) 的出色作品!
如果这个解决方案可能对某人有帮助,这里是最终代码的片段。
配置文件(options.cfl):
\LettrineOptionsFor{A}{slope=0.1\LettrineWidth, findent=-.5em, nindent=.7em}
\LettrineOptionsFor{À}{slope=0.1\LettrineWidth, findent=-.5em, nindent=0.7em}
\LettrineOptionsFor{V}{slope=-0.1\LettrineWidth, lhang=0.5, nindent=0pt}
\LettrineOptionsFor{C'}{nindent=-0.5em}
\LettrineOptionsFor{Q}{loversize=-0.1, lraise=0.1}
宏及其调用:
\newcommand{\blah}{\lipsum*[1-2][1-5]}
\newcommand{\TestLettrine}[1]{%
\lettrine[lines=3]{#1}{} lines: 3 \\ \blah
\vspace*{3ex}
\lettrine[lines=4]{#1}{} lines: 4 \\ \blah
\clearpage
}%
\newcommand{\TestAllLettrines}{%
\foreach \char in {A, À, C', Q, V }{%
\TestLettrine{\char} \par%
}%
}%
\TestAllLettrines
给出了示例的选项。