有关的 :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
时使分号有效。可以很好地应对这种情况,因为测试为真,并在此基础上继续进行。然而,Tifrenchb
tikzmark
babel
钾Z 库尝试在 Ti 中处理代码中的活动字符钾Z 图片也是如此,因此它试图避免由使babel
分号处于活动状态的软件包引起的问题,这与试图tikzmark
避免相同问题的做法相冲突。本质上,试图避免问题的两件事最终相互抵消。
请注意,我对此了解不够充分,无法给出详细的说明,甚至上述手势也可能是错误的,但类似的事情似乎正在发生。
我认为,这里真正的问题是,tikzmark
不应该假设如果分号在\tikzmark
使用时处于活动状态,那么它在 s 中也会处于活动状态,tikzpicture
因为如果babel
Ti钾使用了 Z 库。由于这是文档使用 Babel 配置(使字符处于活动状态)时的标准建议,tikzmark
因此本质上会破坏按照最佳实践编写的代码。
我认为tikzmark
应该测试一下哪些活动字符正在被tikzpicture
s 内的代码处理。这种方法不能保证不会出现故障,但它应该可以防止在标准情况下出现故障,在这种情况下,用户只需加载babel
Ti钾Z 库并依靠它来正确设置。
您可以通过重新定义 来解决这个问题\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 中的问题,我希望在实际文档中也能解决这个问题。可能还需要测试 Ti钾Z 正在处理节点中的活动字符。但是,这在标准情况下应该无关紧要,我认为需要针对具体情况进行定制。在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}