买者自负

买者自负

我在用森林制作流程图时遇到了问题。 这是 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。此时,树前言和树规范已被解析。因此,尽管 TiZ 在使用图书馆时关闭了简写babel,这对 Forest 来说太晚了。麻烦已经造成了。

我们需要做的是尽早关闭简写 - 事实上,越早越好。理想情况下,我们希望在stages定义之前完成此操作,这甚至发生在解析树的前言之前。有一种方法可以通过使用可选的括号参数来改变 Forest 在这里所做的事情,但目前这里唯一可用的键是stages,无论如何,我们在这个参数中传递的任何内容都将只执行Forest 已定义其默认值stages。这可能会也可能不会造成问题,但在完成此操作之前关闭简写肯定更安全。

出于这个原因,我尝试修补宏,方法是在宏前面添加一份负责关闭简写的\forest@config代码副本。这确保在 Forest 定义默认值之前以及在完成任何本地配置(更不用说树序言和规范)之前,简写就已经关闭。tikz.code.texstages

为此,我加载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,然后必须执行以下三件事之一:

  1. 避免在此处出现任何有问题的字符;
  2. 在 Babel 激活简写之前,即在文档前言中定义你的设置(我认为,在加载 Babel 之后执行此操作是可以的,只要是在之前即可\begin{document}
  3. 使用前请关闭短手功能,使用\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

在 <code>forest</code> 中关闭主动短手功能

相关内容