不加思索地使用\def、\let等\global会造成生命损失。

不加思索地使用\def、\let等\global会造成生命损失。

我正在用 LaTeX 创建一份文档,其中包含位于单独的 BibTeX 文件中的参考书目。

当我在没有任何参考书目的情况下编译文档时,它可以正确运行,但是当我添加对参考书目的引用时,它会发送以下错误。

! You can't use `the character 1' after \the.

我做了一些测试,当我删除时tikzpicture,整个文件(包括参考书目)都可以正确编译。但是当我再次添加图片时,我得到了同样的错误。

以下代码是带有触发错误的图像的示例。

\documentclass[openany]{book}
\usepackage[utf8]{inputenc} 
%Si se activa no funcionan algunos gráficos
\usepackage[english]{babel}
\usepackage{graphicx}
\usepackage{tikz}
\usepackage{circuitikz}
\usepackage{amsmath}

\usetikzlibrary{positioning,shadows,backgrounds}
\usetikzlibrary{positioning,shadows,backgrounds,arrows,intersections}
\usepackage{cite}
\usepackage{float}
\usepackage{venndiagram}
\usepackage{amssymb}
\usepackage{amsfonts}

\usepackage{pgf}
\usetikzlibrary{arrows,automata}
\usepackage{verbatim}



\usepackage[left=2cm,right=2cm, top=2.5cm, bottom=2.5cm]{geometry}
\usetikzlibrary{decorations.pathmorphing,patterns}
\usetikzlibrary{trees}
%\setlength\parindent{0pt}
\usepackage{cancel}

\setcounter{secnumdepth}{3} %para que ponga 1.1.1.1 en subsubsecciones
\setcounter{tocdepth}{3} % para que ponga subsubsecciones en el indice

\usepackage{titlesec}

\graphicspath{ {imagenes/} }

\titleformat
{\chapter} % command
[display] % shape
{\bfseries\Large\itshape} % format
{}
%{Story No. \ \thechapter} % label
{0.5ex} % sep
{
    \rule{\textwidth}{1pt}
    \vspace{1ex}
    \centering
} % before-code
[
\vspace{-0.5ex}%
\rule{\textwidth}{0.3pt}
] % after-code

\setlength{\parskip}{1ex}


\begin{document}

\title{Apuntes y Tareas de Probabilidad.}
\author{Luis Alejandro Barranco Ju\'arez}


\maketitle

%\begin{titlepage}
%\begin{center}
%\begin{Huge}
%\textsc{Apuntes y Tareas.}
%\end{Huge}
%\end{center}
%\end{titlepage}

\pagenumbering{roman}

\tableofcontents % indice de contenidos

\newpage

\pagenumbering{arabic}

\chapter{Tarea 1} 
\markboth{TAREA 1}{TAREA 1}

\section{Tri\'angulos de Pascal.}   

\begin{tikzpicture}[x=13mm,y=9mm]
    % some colors
    \colorlet{even}{cyan!60!black}
    \colorlet{odd}{orange!100!black}
    \colorlet{links}{red!70!black}
    \colorlet{back}{yellow!20!white}
    % some styles
    \tikzset{
            box/.style={
            minimum height=5mm,
            inner sep=.7mm,
            outer sep=0mm,
            text width=10mm,
            text centered,
            font=\small\bfseries\sffamily,
            text=#1!50!black,
            draw=#1,
            line width=.25mm,
            top color=#1!5,
            bottom color=#1!40,
            shading angle=0,
            rounded corners=2.3mm,
            drop shadow={fill=#1!40!gray,fill opacity=.8},
            rotate=0,
            },
            link/.style={-latex,links,line width=.3mm},
            plus/.style={text=links,font=\footnotesize\bfseries\sffamily},
    }
    % Pascal's triangle
    % row #0 => value is 1
    \node[box=odd] (p-0-0) at (0,0) {1};
    \foreach \row in {1,...,16} {
     % col #0 => value is 1
            \node[box=odd] (p-\row-0) at (-\row/2,-\row) {1};
            \pgfmathsetmacro{\value}{1};
            \foreach \col in {1,...,\row} {
        % iterative formula : val = precval * (row-col+1)/col
        % (+ 0.5 to bypass rounding errors)
            \pgfmathtruncatemacro{\value}{\value*((\row-\col+1)/\col)+0.5};
            \global\let\value=\value
            % position of each value
            \coordinate (pos) at (-\row/2+\col,-\row);
            % odd color for odd value and even color for even value
            \pgfmathtruncatemacro{\rest}{mod(\value,5)}
            \ifnum \rest=0
                    \node[box=even] (p-\row-\col) at (pos) {\value};
            \else
                    \node[box=odd] (p-\row-\col) at (pos) {\value};
            \fi
      % for arrows and plus sign
%      \ifnum \col<\row
%        \node[plus,above=0mm of p-\row-\col]{+};
%        \pgfmathtruncatemacro{\prow}{\row-1}
%        \pgfmathtruncatemacro{\pcol}{\col-1}
%        \draw[link] (p-\prow-\pcol) -- (p-\row-\col);
%        \draw[link] ( p-\prow-\col) -- (p-\row-\col);
%      \fi
            }
    }
    \begin{pgfonlayer}{background}
            % filling and drawing with the same color to enlarge background
            \path[draw=back,fill=back,line width=5mm,rounded corners=2.5mm]
            (  p-0-0.north west) -- (  p-0-0.north east) --
            (p-16-16.north east) -- (p-16-16.south east) --
            ( p-16-0.south west) -- ( p-16-0.north west) --
            cycle;
    \end{pgfonlayer}
    \end{tikzpicture}

    Para n=5.

    \cite{Polya}

\addcontentsline{toc}{chapter}{Bibliografía}
\bibliographystyle{acm} % estilo de la bibliografía.
\bibliography{prueba} % biblio.bib es el fichero donde está salvada la bibliografía.

\end{document}

我的.bib文件如下所示:

@book{Polya,
author    = "G.Polya",
title     = "How to Solve It",
publisher = "Princeton University Press",
year      = "1957",
}

导致这个问题的原因是什么?

答案1

不加思索地使用\def\let\global会造成生命损失。

不管怎样,他们都在浪费时间,如果你浪费的时间太多,你的生命就完了。


您已覆盖 TeX 的定义,\value并通过以下方式使此重新定义成为全局的:

\global\let\value=\value

因此,TeX 无法执行任何依赖于\value文档中这一点之后的操作。引用只是附带损害。

这是一个重现该错误的示例,虽然不是最小的,但至少是更简单的:

\documentclass{article}
\usepackage{tikz}
\begin{document}
\ifnum\value{page}=1 hi\else bye\fi

\begin{tikzpicture}
  \foreach \row in {1,...,16} {
    \pgfmathsetmacro{\value}{1}
    \foreach \col in {1,...,\row} {
      \pgfmathtruncatemacro{\value}{\value*((\row-\col+1)/\col)+0.5};
      \global\let\value=\value
    }
  }
\end{tikzpicture}

\ifnum\value{page}=1 hi\else bye\fi
\end{document}

可以通过确保新的宏名不会覆盖现有宏名来解决该问题。在这种情况下,替换\myvalue即可\value

使用\newcommand*\value{1}而不是\pgfmathsetmacro{\value}{1}会提供一条信息丰富的错误消息来解释问题。

相关内容