포리스트의 sn 가장자리와 멋진 빈 노드 스타일은 0으로 나누게 됩니다. 무슨 일이야?

포리스트의 sn 가장자리와 멋진 빈 노드 스타일은 0으로 나누게 됩니다. 무슨 일이야?

그만큼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라이브러리 까지 문제를 추적했습니다 . 다음 코드는 .pgfintersectionsforest

\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}}}

나는 그 문제를 좀 더 조사해 보았습니다. \pgfintersectionofpathscall 은 \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로 컴파일

따라서 글꼴을 올바르게 선택하면 오류를 피할 수 있습니다. 하지만 개인적으로는 글꼴 선택에 관계없이 이를 방지하는 방법에 대한 설명이 있는 것을 선호합니다.

관련 정보