그만큼forest
수동sn edges
및 의 두 가지 스타일을 정의합니다 nice empty nodes
. 이는 다음과 같이 정의됩니다.
sn edges/.style={for tree={parent anchor=south, child anchor=north}}
그리고
nice empty nodes/.style={for tree={calign=fixed edge angles},delay={where content={}{shape=coordinate,for parent={for children={anchor=north}}}{}} }
각기.
이 두 스타일을 다음 트리와 함께 사용하면 다음 오류가 발생합니다.
! Package PGF Math Error: You asked me to calculate `1/0.0', but I cannot divid
e any number by zero.
See the PGF Math package documentation for explanation.
Type H <return> for immediate help.
...
l.51 \end{forest}
무슨 일이 일어나고 있는지 아는 사람 있나요? 이 문제를 어떻게 해결할 수 있나요?
MWE
\documentclass{article}
\usepackage{forest}
\forestset{
sn edges/.style={for tree={parent anchor=south, child anchor=north}},
nice empty nodes/.style={for tree={calign=fixed edge angles},delay={where content={}{shape=coordinate,for parent={for children={anchor=north}}}{}}}
}
\begin{document}
\begin{forest} nice empty nodes, sn edges
[TP
[{the ball} ]
[
[T ]
[PrP
[{$<$the ball$>$} ]
[
[Pr ]
[VoiP
[{$<$the ball$>$} ]
[
[Voi ]
[AffP
[{to Mary} ]
[
[Aff ]
[ThP
[{$<$the ball$>$} ]
[
[Th ]
[AgP
[{by John} ]
[
[Ag ]
[$\surd$throw ]
]
]
]
]
]
]
]
]
]
]
]
]
\end{forest}
\end{document}
업데이트
Aff
흥미롭게도 리프 아래의 모든 항목이 삭제 되면 오류 없이 컴파일됩니다 . 즉, 다음이 컴파일됩니다.
\begin{forest} nice empty nodes, sn edges
[TP
[{the ball} ]
[
[T ]
[PrP
[{$<$the ball$>$} ]
[
[Pr ]
[VoiP
[{$<$the ball$>$} ]
[
[Voi ]
[AffP
[{to Mary} ]
[
[Aff ]
]
]
]
]
]
]
]
]
\end{forest}
답변1
먼저 주의할 점은 스타일이 없어도 오류가 발생한다는 것입니다 sn edges
.
나는 이것이 가 forest
아니라 pgf
버그라고 생각합니다. 님의 \pgfintersectionofpaths
라이브러리 까지 문제를 추적했습니다 . 다음 코드는 .pgf
intersections
forest
\pgfintersectionofpaths{%
\pgfpathmoveto{\pgfpoint{0.0pt}{-3.53297pt}}
\pgfpathlineto{\pgfpoint{19.54204pt}{-31.44316pt}}%
}{%
\pgfpathmoveto{\pgfpoint{34.6372pt}{-53.00208pt}}%
\pgfpathlineto{\pgfpoint{19.54204pt}{-31.44316pt}}}
나는 그 문제를 좀 더 조사해 보았습니다. \pgfintersectionofpaths
call 은 \pgfpointintersectionoflines
어떤 점에 좌표 변환을 적용하여 두 선의 교차점을 계산합니다. 이전 문장의 두 "some"에 대한 수학적 세부 사항은 중요하지 않습니다. 단, 관련 변환 행렬에 대한 PGF 계산의 마지막 단계는 를 호출하여 다른 행렬을 반전시키는 것입니다 \pgftransforminvert
. \pgftransforminvert
반전하려는 행렬이 거의 특이하기 때문에 실패합니다 . PGF 매뉴얼(p. 641)에서는 이런 일이 발생할 것이라고 경고합니다.
이 명령은 행렬의 행렬식이 너무 작은 경우, 즉 행렬이 거의 특이적인 경우 오류를 생성합니다.
그런데 행렬이 특이항에 가까운 이유는 무엇입니까? 우리가 교차시키려는 선분은 거의 평행하기 때문입니다. 이 시점에서 나는 문제의 원인이 TeX의 수치적 정밀도인 것처럼 보였습니다. 하지만 ...
\pgfpointintersectionoflines
를 호출 하여 선의 교차점을 계산하기 전에 \pgfintersectionofpaths
선이 교차하는지 감지하려고 시도합니다. 이는 \if
-like 에서 수행됩니다 \pgfiflinesintersect
. 그래서 문제는 \pgfiflinesintersect
선이 교차하지만 \pgfpointintersectionoflines
교차점을 계산하는 동안 실패한다고 주장하는 것입니다. (의 코드에는 \pgf@iflinesintersect
"16384는 강력한 선택이 아닐 수 있습니다."라는 설명이 포함되어 있습니다. 여기서 16384는 일부 내부 정규화 프로세스에서 사용되는 상수입니다. 이것이 문제의 원인이 될 수 있습니까?)
의 행동을 \pgfintersectionofpaths
더욱 자세히 조사해 보니 실제로는 일관성이 없다는 것을 깨달았습니다. 다음 호출을 통해 \pgfintersectionofpaths
동일한 결과(교차점 1개, 원점)가 나올 것으로 예상할 수 있습니다.
\pgfintersectionofpaths
{\pgfpathmoveto{\pgfpoint{0pt}{0pt}}\pgfpathlineto{\pgfpoint{1pt}{0pt}}}
{\pgfpathmoveto{\pgfpoint{0pt}{0pt}}\pgfpathlineto{\pgfpoint{0pt}{1pt}}}
\pgfintersectionsolutions
\pgfintersectionofpaths
{\pgfpathmoveto{\pgfpoint{0pt}{0pt}}\pgfpathlineto{\pgfpoint{1pt}{0pt}}}
{\pgfpathmoveto{\pgfpoint{0pt}{0pt}}\pgfpathlineto{\pgfpoint{-1pt}{0pt}}}
\pgfintersectionsolutions
그러나 이는 사실이 아닙니다. 선이 수직인 첫 번째 경우에는 교차점이 1개 생성되고, 선이 (정확히) 평행한 다른 경우에는 교차점이 0개 생성됩니다.
이 문제를 해결하고 싶지만 문제가 나에게는 너무 복잡해 보입니다. 어쨌든 토론이 필요하고 작성자에게 pgf
알려야 한다고 생각합니다.
답변2
왜 이런 일이 발생하는지 잘 모르겠지만 이 오류는 사용된 글꼴과 관련된 것 같습니다.
다음 구성을 사용하여 MWE를 컴파일할 때 오류를 복제할 수 있습니다.
- 글꼴 사양 없음(컴퓨터/라틴 현대), pdfLaTeX 또는 XeLaTeX로 컴파일됨
\usepackage{palatino}
, pdfLaTeX 또는 XeLaTeX로 컴파일됨\usepackage{libertine}
, pdfLaTeX 또는 XeLaTeX로 컴파일됨\usepackage{fontspec} \setmainfont{Linux Libertine O}
, XeLaTeX로 컴파일\usepackage{fontspec} \setmainfont{Doulos SIL}
, XeLaTeX로 컴파일\usepackage{fontspec} \setmainfont{TeX Gyre Pagella}
, XeLaTeX로 컴파일
그러나 이러한 구성을 사용하면 오류 없이 컴파일됩니다.
\usepackage{times}
, pdfLaTeX 또는 XeLaTeX로 컴파일됨\usepackage{kpfonts}
, pdfLaTeX 또는 XeLaTeX로 컴파일됨\usepackage{fontspec} \setmainfont{Charis SIL}
, XeLaTeX로 컴파일\usepackage{fontspec} \setmainfont{Cambria}
, XeLaTeX로 컴파일\usepackage{fontspec} \setmainfont{Brill}
, XeLaTeX로 컴파일\usepackage{fontspec} \setmainfont{Times New Roman}
, XeLaTeX로 컴파일
이 경우 다른 오류가 발생했습니다(크기가 \end{forest}
줄에 너무 큼).
\usepackage{fontspec} \setmainfont{TeX Gyre Termes}
, XeLaTeX로 컴파일
따라서 글꼴을 올바르게 선택하면 오류를 피할 수 있습니다. 하지만 개인적으로는 글꼴 선택에 관계없이 이를 방지하는 방법에 대한 설명이 있는 것을 선호합니다.