tikzmark、babel 包(法语)和 babel tikzlibrary 之间的冲突

tikzmark、babel 包(法语)和 babel tikzlibrary 之间的冲突

有关的 :Tikzmark 和法语似乎存在冲突

我出于以下三个原因在评论中提出了这个问题并提出了解决方法:

  • 这可能对其他用户有用。
  • 仅当 babel 包和 babel tikzlibrary 同时加载时,此解决方法才会成功。
  • 肯定有人能提供比我的解决方法更好的答案。

我没有在这里看到其他类似的问题,但如果我错过了一个,请告诉我,我会删除我的问题。

有了这个 MWE:

\documentclass{article}
\usepackage[frenchb]{babel}
\usepackage{tikz}
\usetikzlibrary{calc,babel,tikzmark}
\begin{document}
test\tikzmark{a} 

Go to test\tikz[overlay, remember picture] \draw[->] to (pic cs:a);.
\end{document}

该文档无法编译。

如果我们删除 \usetikzlibrary 或 babel 包中的 babel,它就可以编译。

问题:我们如何让 \tikzmark 使用 babel 包和 babel 库以及使用 babel 包但不使用 babel 库来完成其工作。

答案1

的新版本tikzmark可供测试github希望可以解决所有主动/非主动/停​​用/反应性分号问题。

事实证明,底层\tikz命令还有另一种形式,可以避免使用分号。\tikz[...] ...;人们可以这样写\tikz[...]{...},而\tikzmark不是使用这种形式。

请通过下载tikzmark.dtx、运行tex tikzmark.dtx并将生成的文件放在tex可以找到它们的地方来测试它。然后用您的文档试用它,并让我知道它是否有效。

答案2

问题是tikzmark测试分号是否有效并据此继续。现在,包在有效babel时使分号有效。可以很好地应对这种情况,因为测试为真,并在此基础上继续进行。然而,TifrenchbtikzmarkbabelZ 库尝试在 Ti 中处理代码中的活动字符Z 图片也是如此,因此它试图避免由使babel分号处于活动状态的软件包引起的问题,这与试图tikzmark避免相同问题的做法相冲突。本质上,试图避免问题的两件事最终相互抵消。

请注意,我对此了解不够充分,无法给出详细的说明,甚至上述手势也可能是错误的,但类似的事情似乎正在发生。

我认为,这里真正的问题是,tikzmark不应该假设如果分号在\tikzmark使用时处于活动状态,那么它在 s 中也会处于活动状态,tikzpicture因为如果babelTi使用了 Z 库。由于这是文档使用 Babel 配置(使字符处于活动状态)时的标准建议,tikzmark因此本质上会破坏按照最佳实践编写的代码。

我认为tikzmark应该测试一下哪些活动字符正在被tikzpictures 内的代码处理。这种方法不能保证不会出现故障,但它应该可以防止在标准情况下出现故障,在这种情况下,用户只需加载babelTiZ 库并依靠它来正确设置。

您可以通过重新定义 来解决这个问题\tikzmark。例如,

    \makeatletter
    \renewcommand\tikzmark@outside[2][]{%
      \ifnum\catcode`\;=\active
        \iftikz@handle@active@code
          \let\tikzmark@next=\tikzmark@nonactive
        \else
          \let\tikzmark@next=\tikzmark@active
        \fi
      \else
        \let\tikzmark@next=\tikzmark@nonactive
      \fi
      \tikzmark@next{#1}{#2}%
    }    
    \makeatother

至少似乎解决了 MWE 中的问题,我希望在实际文档中也能解决这个问题。可能还需要测试 TiZ 正在处理节点中的活动字符。但是,这在标准情况下应该无关紧要,我认为需要针对具体情况进行定制。在babel使用该库的标准情况下,活动字符在代码和节点中均得到处理,因此测试一个就足够了。此外,至少在 MWE 中,在节点中处理活动字符而不是在代码中处理活动字符不是重现错误,这就是为什么我专门测试了导致问题的代码处理。

不过,我建议向tikzmark作者报告这个问题,因为几乎肯定有比我在这里提出的更优雅的方法来处理这个问题。

完整示例:

\documentclass[frenchb]{article}
\usepackage{tikz}
\usepackage{babel}
\usetikzlibrary{babel,tikzmark}
\makeatletter
\renewcommand\tikzmark@outside[2][]{%
  \ifnum\catcode`\;=\active
    \iftikz@handle@active@code
      \let\tikzmark@next=\tikzmark@nonactive
    \else
      \let\tikzmark@next=\tikzmark@active
    \fi
  \else
    \let\tikzmark@next=\tikzmark@nonactive
  \fi
  \tikzmark@next{#1}{#2}%
}    
\makeatother
\begin{document}
test\tikzmark{a}

Go to test%
\begin{tikzpicture}[overlay, remember picture]
  \draw[->] (0,0) to ({pic cs:a});
\end{tikzpicture}%
.

\end{document}

测试 测试

相关内容