`\href` 环境中的自定义命令中的条件代码

`\href` 环境中的自定义命令中的条件代码

以下是我的 MWE。我定义了一个函数,因为我想在我的文档中发布许多链接。这些链接指向一个显示德国法律的网站;要么是该法律的概述页面,要么如果指定(使用可选参数),则直接跳转到某个段落:

\documentclass[12pt]{article} 
\usepackage{hyperref}
\usepackage{ifthen}
\usepackage{xifthen}

\begin{document}

\newcommand{\gesetze}[2]{http://www.gesetze-im-internet.de/#1/
\ifthenelse{\isempty{#2}}{}{
  \textunderscore\textunderscore#2.html
  }
  }


\href{\gesetze{bgb}{622}}{This is the 622nd paragraph in the law.}
% \href{\gesetze{bgb}}{This is the main page on that law.}

\end{document}

当函数\gesetze{bgb}{622}不在参数中\href,而只是纯文本中时,上述方法有效。

\href但是,当我想将其包含在-command 中时,会显示错误,或者当我取消注释该函数没有可选参数的行时。

日志中有一些带有下划线的奇怪输出和标志,因此我_用替换了\textunderscore

需要做什么才能使函数接受一个或两个参数,根据需要将它们构建在一起以创建链接,并将它们安全地传递给 hyperref?

答案1

您需要一些可扩展的东西,ifthen 和 xifthen 将不起作用。

\documentclass[12pt]{article}
\usepackage{hyperref}


\begin{document}

\ExplSyntaxOn
 \newcommand{\gesetze}[2]
   {
    http\c_colon_str//www.gesetze-im-internet.de/#1/
    \tl_if_blank:nF {#2}{__#2.html}
   }
\ExplSyntaxOff
\href{\gesetze{bgb}{622}}{This is the 622nd paragraph in the law.}

\href{\gesetze{bgb}{}}{This is the main page on that law.}

\end{document}

答案2

如果您想更频繁地链接到特定段落/部分或整个法律以及一些文本,您可以为此定义专用命令。

我使用etoolbox's\ifblank来测试字符串是否为空,因为我通常etoolbox更喜欢测试而不是ifthen,但这只是一个风格问题。

\documentclass[12pt]{article}
\usepackage{etoolbox}
\usepackage{hyperref}

\newcommand{\lawlinktext}[3][]{%
  \def\lawlinktexturl{http://www.gesetze-im-internet.de/#2/}%
  \ifblank{#1}
    {}
    {\appto\lawlinktexturl{__#1.html}}%
  \href{\lawlinktexturl}{#3}}

\begin{document}
\lawlinktext[622]{bgb}{This is the 622nd paragraph in the law.}

\lawlinktext{bgb}{This is the main page on that law.}
\end{document}

正确链接的文本

没有辅助宏的替代定义是

\newcommand{\lawlinktext}[2][]{%
  \ifblank{#1}
    {\href{http://www.gesetze-im-internet.de/#2/}}
    {\href{http://www.gesetze-im-internet.de/#2/__#1.html}}}

但我们必须重复 URL 存根。

这里我们还使用了 TeX 自动抓取的剩余参数\href

相关内容