我在用森林制作流程图时遇到了问题。 这是 MWE下面是日志文件的内容:
\documentclass[12pt,twoside]{report}
\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usepackage{forest}
\usetikzlibrary{babel}
\begin{document}
\chapter*{Resume} % * avoids numeration
\begin{forest}
for tree={
rounded corners, draw, align=center, top color=white, bottom color=blue!20,
edge+=->,
l sep'+=10pt,
},
[Solvatación
[Explícito+Implícito
[Solvateshell + Cosmo]
[Packmol + Cosmo]
]
[Implícito
[Cosmo]
]
]
\end{forest}
\end{document}
错误是:
! Argument of \language@active@arg> has an extra }. <inserted text> \par l.16 \end{forest} I've run across a }' that doesn't seem to match anything. For example, \def\a#1{...}' and \a}' would produce this error. If you simply proceed now, the \par' that I've just inserted will cause me to report a runaway argument that might be the root of the problem. But if your }' was spurious, just type 2' and it will go away. Runaway argument?
有什么帮助吗?
答案1
你可以通过修补内部配置宏来解决这个问题,而不必全局关闭 Babel 简写。注意:这修补了一个内部的宏。我强烈建议向 Forest 的作者发送电子邮件,并附上此问题的链接,因为 Sašo 可能有更安全的替代方案(或愿意创建一个)。理想情况下,我认为这应该是 Forest 本身的一部分。
买者自负
tikzpicture
问题是 Forest直到该阶段才调用draw tree
。此时,树前言和树规范已被解析。因此,尽管 Ti钾Z 在使用图书馆时关闭了简写babel
,这对 Forest 来说太晚了。麻烦已经造成了。
我们需要做的是尽早关闭简写 - 事实上,越早越好。理想情况下,我们希望在stages
定义之前完成此操作,这甚至发生在解析树的前言之前。有一种方法可以通过使用可选的括号参数来改变 Forest 在这里所做的事情,但目前这里唯一可用的键是stages
,无论如何,我们在这个参数中传递的任何内容都将只执行后Forest 已定义其默认值stages
。这可能会也可能不会造成问题,但在完成此操作之前关闭简写肯定更安全。
出于这个原因,我尝试修补宏,方法是在宏前面添加一份负责关闭简写的\forest@config
代码副本。这确保在 Forest 定义默认值之前以及在完成任何本地配置(更不用说树序言和规范)之前,简写就已经关闭。tikz.code.tex
stages
为此,我加载etoolbox
并添加了
\makeatletter
\pretocmd\forest@config{% from tikz.code.tex
\iftikz@handle@active@code\tikz@switchoff@shorthands\fi}{\typeout{Patched \string\forest@config\ OK.}}{\typeout{Failed to patch \string\forest@config\ - oh, dear.}}
\makeatother
回到序言。
forest
此修补程序仅影响树的创建。如果您在环境或类似环境之外设置林键,则使用\forestset
,然后必须执行以下三件事之一:
- 避免在此处出现任何有问题的字符;
- 在 Babel 激活简写之前,即在文档前言中定义你的设置(我认为,在加载 Babel 之后执行此操作是可以的,只要是在之前即可
\begin{document}
; - 使用前请关闭短手功能,使用
\forestset
后再打开。
无论如何,我更喜欢将全局设置保留在序言中,因此我建议使用第二个选项,这当然是最直接的。
完整代码:
\documentclass[12pt,twoside,a4paper,spanish]{report}
\usepackage[headheight=18pt, width=150mm, top=25mm, bottom=25mm, bindingoffset=6mm, headsep=18pt]{geometry}
\usepackage{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[activate={true,nocompatibility},final,tracking=true,kerning=true,spacing=true,factor=1100,stretch=10,shrink=10]{microtype}
\usepackage[hyphens]{url}
\usepackage{textcomp}
\usepackage{tikz}
\usepackage{forest,etoolbox}
\usetikzlibrary{babel}
\makeatletter
\pretocmd\forest@config{% from tikz.code.tex
\iftikz@handle@active@code\tikz@switchoff@shorthands\fi}{\typeout{Patched \string\forest@config\ OK.}}{\typeout{Failed to patch \string\forest@config\ - oh, dear.}}
\makeatother
\begin{document}
\chapter*{Resume} % * avoids numeration
"c
\begin{forest}
for tree={
rounded corners, draw, align=center, top color=white, bottom color=blue!20,
edge+=->,
l sep'+=10pt,
},
[Solvatación
[Explícito+Implícito
[Solvateshell + Cosmo]
[Packmol + Cosmo]
]
[Implícito
[Cosmo]
]
]
\end{forest}
"c
\end{document}
它们是为了展示在之前和之后的"c
外部主动速记工作。forest