将值传递给 \bibleverse

将值传递给 \bibleverse

请帮我找出如何将值传递给命令,该命令具有括在(...)中的附加参数。

\usepackage{bibleref}
\usepackage{xstring}

\begin{document}
\bibleverse{Gen}(9:9)
\bibleverse{Gen}(\StrBehind{Gen 9:9}{Gen })
\end{document}

这会出现错误:

! Paragraph ended before \@bibleverse was complete.

答案1

在 中发生的赋值\StrBehind不可扩展,因此不能直接传递给\bibleverse。此外,如果没有完全展开, (内部) 捕获的参数\bibleverse将无法正确拆分。您需要先存储该值,然后将扩展版本传递给\bibleverse

在此处输入图片描述

\documentclass{article}
\usepackage{bibleref,xstring}% http://ctan.org/pkg/{bibleref,xstring}
\begin{document}
\bibleverse{Gen}(9:9)

\StrBehind{Gen 9:9}{Gen }[\chapverse]
\expandafter\bibleverse\expandafter{\expandafter G\expandafter e\expandafter n\expandafter}\expandafter(\chapverse)
\end{document}

\StrBehind{<stringA>}{<stringB>}[<cmd>]将 中的所有内容存储<stringB><stringA><cmd>。适当放置的\expandafters 确保\chapverse在 括号内的参数解析\bibleverse执行之前展开。

答案2

如果您的目的是仅指定\macro{Gen 9:9}并格式化它,就像您写的那样\bibleverse{Gen}(9:9),那么xstring就不需要了:

\documentclass{article}
\usepackage{bibleref}

\makeatletter
\newcommand{\shortbibleverse}[1]{\@shortbibleverse#1\@nil}
\def\@shortbibleverse#1 #2\@nil{\bibleverse{#1}(#2)}
\makeatother

\begin{document}
\bibleverse{Gen}(9:9)

\shortbibleverse{Gen 9:9}
\end{document}

根据您的喜好重命名\shortbibleverse

该宏的工作原理是在(第一个)空格处拆分参数,将之前的内容作为强制参数传递,\bibleverse将之后的内容作为括号中的可选参数传递。

在此处输入图片描述

相关内容