Tikz-hibaüzenet: Missing number, treated as zero. [megoldva]

Fórumok

Sziasztok.

Egy Tikz-grafika egyik yshift koordinátáját szeretném paraméterrel ellátni, de az újabb tikz-verziók az alábbi kódot képtelenek úgy feldolgozni, hogy az összeadásnál a \szamertek -et számként kezeljék.

\def\szamertek{1cm}

\begin{tikzpicture}[remember picture,overlay]
    \node[ inner sep=0pt, xshift=1.5\linewidth, yshift=-1.5cm+\szamertek] at (pic cs:stickit) 
    {\includegraphics[width=.6\linewidth]{valami.eps}};
\end{tikzpicture}

Ez a hibaüzenetem van:

! Missing number, treated as zero.
<to be read again> 
                   p

vagyis a \szamertek nulla lesz, ami számomra hatalmas kavarodást okoz.

Mi lehet a megoldás?

Hozzászólások

Nálam egy csupaszított változat megy:

\documentclass[12pt]{article}
\usepackage{tikz}
\begin{document}
\def\szamertek{1cm}
\begin{center}
\begin{tikzpicture}[remember picture,overlay]
    \node[yshift=-1.5cm+\szamertek] at (0,0) {node};
        \draw (0,0) circle (1cm);
\end{tikzpicture}
\end{center}
\end{document}

A node felirat a kör alján belül van, tehát a 0,5 centi lefelé stimmelhet is.

Ha nálad is megy, akkor szerintem nem a mértékegységek összeadásával van probléma.

A tikz verziója 3.1.10 (2023-01-15).

Ha hibátlan, akkor csak össze tudja adni rendesen.

Tudsz egy teljes kódot közölni, ami produkálja a hibaüzenetet? Nálam a nyitó hozzászólásodban a (pic cs:stickit) részre azt írta, hogy ismeretlen koordinátarendszer. Nem volt kedvem keresgélni, milyen csomagot kell betölteni hozzá, ezért lenne jó látni egy teljes kódot (usepackage-okkal együtt).

Hááát, a kód, a preambulum meg minden egyéb az majdnem 4000 sor.
Az idevágó részlet a következő:
 

\usetikzlibrary{tikzmark}
\usetikzlibrary{backgrounds}



\def\fejvegm{\newpage
\vspace{0.5cm}
}

\def\fejvegf{\disz
\newpage
\vspace{0.5cm}
}

\def\fejvegk{%
\imageattheend
\newpage
\vspace{0.5cm}
}

\def\fejvegv{
\vspace{0.5cm}
}

\def\fejvegvd{\disz
\vspace{0.5cm}
}

\def\fejvegvx{
\vspace{0.5cm}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%% FEJEZETKEZDÉS ALAPÉRTÉKEI:
\def\fejezetalapertekek{%
 \def\csikhossz{1} % százalékban megadva
 \def\elottehezag{0cm}
 \def\feltolas{0cm} % kép feljebb tolása
 \def\igazitas{0cm} % kép vízszintes eltolása
 \def\nyitokepnagyitas{1}% kép nagyítása
 \def\nyitokepidezet{\vspace{0ex}} % idézet vagy extra térköz
 \def\cimelottihely{\hspace{1em}}
}
\fejezetalapertekek
%% -------------------------


\def \honaplenia{\ev{#1}. \roma{#2}. \ev{#3}.}
%
\FloatBarrier 
%
% Lapvége-makró indíátsa:
\IfFileExists{./lapvegi-toresek/lapvege-#1-#2-#3}{\input{./lapvegi-toresek/lapvege-#1-#2-#3}}{}
%
%
\noindent
\def\filenametovegeps{#1-#2-#3-1.eps}
\phantomsection
\addcontentsline{toc}{section}{\cim}
%
{\vspace{\elottehezag}} %címblokk előtti hely
%
\begin{figure}[h!]
 \begin{subfigure}{0.47\textwidth}
%%%%
   \hspace{\igazitas} 
%
  \begin{tikzpicture}[remember picture,overlay]
    \node[ inner sep=0pt, xshift=1.5\linewidth, yshift=-1.5cm + \feltolas ] at (pic cs:stickit)
    {\IfFileExists{kepek/#1-#2-#3.eps}{\includegraphics[width=\nyitokepnagyitas\linewidth]{kepek/#1-#2-#3}\kepszamlalo}{\includegraphics[width=\nyitokepnagyitas\linewidth,height=20ex]{example-image}}   
    };
   \end{tikzpicture}
%%%%
   \begin{flushright}
         {%
          \hspace{0.5ex}%
          \small 
          \specdatum{#1}{#2}{#3}\cimelottihely\ %
         }
   \end{flushright} 
   \vspace{-2ex}       
   \hbox{\tikz\shade[left color=black,right color=white] (0,0) rectangle (\csikhossz\columnwidth,0.4pt);}
   \par
   {\small 
    \vspace{-1.2ex}    
    \textsc{\cim}
   }
  \bigskip

   #4
 \end{subfigure}
%
 \begin{subfigure}{0.5\textwidth}
   \vspace{-\feltolas}
   \hspace{\igazitas} 
   \includegraphics[width=\nyitokepnagyitas\linewidth]{example-image} 
    \IfFileExists{kepek/#1-#2-#3.eps}{\includegraphics[width=\nyitokepnagyitas\linewidth]{kepek/#1-#2-#3}}{\includegraphics[width=\nyitokepnagyitas\linewidth,height=20ex]{example-image}}   
 \end{subfigure}
{\nyitokepidezet}
\end{figure}
\hspace{-\feltolas}
\smallskip
\fejezetalapertekek 
}

A kód lényege, hogy előbb az eps grafika rajzolódik ki, majd erre (akár ráúsztatva) jön a többi szöveg.  Gyanítom, hogy a tikz csomag keveredése a fő ok. A régiekkel rendben ment minden, nem volt hibaüzenet, a \feltolas értéke nem nullázódott ki.

Megjegyzés: a te példakódodban "node" szöveg szerepel az ide-oda tologatáshoz, az én kódomban nem szöveg, hanem kép tologatódna.

10-féle lény van:
-- aki ismeri a bináris számrendszert,
-- és amelyik nem.

Ehhh... olyanra gondoltam, amit kimásolok egy .tex-fájlba, fordítom és kész.

De egy kicsit gyomlálgattam, és nekem a \begin{subfigure} gyanús. Melyik csomagból szeded? Ha a subfigure csomagból, akkor ott úgy látom, hogy nem környezet, hanem parancs, és paraméterként nem méretet kap, hanem szöveget (akár pl \includegraphics).
Pont ezért lenne jó egy minimális kód, ami teljes mértékben tartalmazza azt, ami problémás, és nem (sokkal) több.

Hirtelen arra gondoltam, hogy a

\begin{tikzpicture}[remember picture,overlay]
...
\end{tikzpicture}

helyett máshogy illeszteném be a képet, de az overlay-t meghagyva.

Lejjebb van egy tikz által berakott színátmenetes csík, annak semmi baja. Igen ám, de a tikzpicture-nál már vannak xy-koordináták, azoknak se kéne változnia...

10-féle lény van:
-- aki ismeri a bináris számrendszert,
-- és amelyik nem.

\documentclass[12pt]{article}
\usepackage{tikz}
\usepackage{subcaption}
\usetikzlibrary{backgrounds}
\usetikzlibrary{tikzmark}
\begin{document}
\def\nyitokepnagyitas{1}
\def\igazitas{0cm}
\def\feltolas{1cm}
\def\csikhossz{1}
\def\cim{ez bizony a cím}
\begin{figure}[h!]
  \begin{subfigure}{0.47\textwidth}
    \hspace{\igazitas} 
    \begin{tikzpicture}[remember picture,overlay]
      \node[ inner sep=0pt, xshift=1.5\linewidth, yshift=-1.5cm + \feltolas ] at (pic cs:stickit) {node};
    \end{tikzpicture}
    \begin{flushright}
      \hspace{0.5ex}%
      \small 
      dátum
     \end{flushright}
     \vspace{-2ex}
     \hbox{\tikz\shade[left color=black,right color=white] (0,0) rectangle (\csikhossz\columnwidth,0.4pt);}
     \par
     {\small 
      \vspace{-1.2ex}    
      \textsc{\cim}
     }
  \end{subfigure}
  \begin{subfigure}{0.5\textwidth}
    \vspace{-\feltolas}
    \hspace{\igazitas} 
    example-image
  \end{subfigure}
  {nyitokepidezet}
\end{figure}
\hspace{-\feltolas}
valami szöveg megint
\end{document}

Ez a kód nálam lefut csont nélkül. Nálad?

Ez gond nélkül lefut.

Ugyanez van az eredeti kódomban is, de ott leáll a fordítás. Megfigyeltem, csak akkor rohad le, ha a \feltolas értéke negatív. Felcserélve a műveletet az eredmény ismét a leállás. Alkalmaztam yshift-nek CSAK a \feltolas-t, a -5cm hozzáadása nélkül. Ez sem jó.

Kicsit olyan érzésem van, mintha a mínusz jelet (-) diviznek értelmezné, azt szövegként kezelné.

10-féle lény van:
-- aki ismeri a bináris számrendszert,
-- és amelyik nem.

Ez gond nélkül lefut.

Ugyanez van az eredeti kódomban is, de ott leáll a fordítás.

Ezért gondolom, hogy nem itt lesz a gond.
A hibát jobban be kellene határolni, mert ennyiből nem tudom reprodukálni. Még ha a mintakódomban át is írom a \feltolas értékét negatívra, akkor is lefut (gondolom, nálad is).

Ahogy szoktam csinálni: a környező kódokat kikommentelem, akár annyira, hogy csak a gyanús rész maradjon. Ha az lefut, akkor fokozatosan adagolom hozzá a kikommentelt részeket, és amikor már nem fut, akkor lehet elkezdeni nézegetni, miért nem. Ha eddig eljutsz és nem boldogulsz vele, azt a részt tedd közzé, hátha valaki tud rá valamit mondani.

Pontosan így szoktam én is behatárolni egy hibát.

Nálam a helyzet komplikáltabb, mert míg erre rájönnék, eltelik fél év. Egyszerűbb az utóbbi hat év teljes anyagát újraírni a nulláról. Rendesen mindent bekommentelve az összes makrónál. Szóval egyelőre úgy állok, hogy csak egyetlen gépen fut le a fordítás hibamentesen, ha az a gép elszáll, lőttek az egésznek.

10-féle lény van:
-- aki ismeri a bináris számrendszert,
-- és amelyik nem.

Nálam a helyzet komplikáltabb, mert míg erre rájönnék, eltelik fél év. Egyszerűbb az utóbbi hat év teljes anyagát újraírni a nulláról.

Te tudod. A fenntarthatóság miatt érdemes lenne rászánni az időt, hogy hol és mi törik el.

Mi a különbség az "egyetlen gép" és a többi gép között? Biztos, hogy a frissebb tikz miatt törik meg, nem más miatt? Ha más nem, rakd fel azt a 4000 sort pastebin-re, hátha megtalálom hamarabb, mint fél év.

Kicsit megőrülök:

Ha nem így: \def\feltolas{1cm}
hanem így: \def\feltolas{+1cm} adom meg a pozitív értékeket, majd a kóban elhagyom a műveleti jeleket, a fordítás lefut. (Na ezt hívom gányolásnak, amit csinálok. Működik, jó is, csak gány. Ezzel az anomália oka nincs meg, csak tüneti kezelést kapott.)

yshift=-1.5cm + \feltolas

helyett

yshift=-1.5cm  \feltolas

10-féle lény van:
-- aki ismeri a bináris számrendszert,
-- és amelyik nem.

A szamertek az ne \def legyen hanem \newlength. Nem biztos hogy ez a megoldas de egy probat meger.

Nem próbáltam ki, de a chatgpt ezt a választ adta:

A probléma az, hogy a \texttt{yshift} argumentuma egy összeadás, amelyben egy számot és egy dimenziót adunk össze. A régebbi TikZ verziók engedték a számként kezelt dimenziók használatát, azonban az újabb verziók szigorúbbak lettek.

Egy megoldás lehet a \texttt{calc} csomag használata, amely lehetővé teszi a dimenziók közvetlen összeadását. Ehhez először importálnod kell a \texttt{calc} csomagot a dokumentumban, majd a \texttt{yshift} értékét a következő módon kell megadnod: \texttt{yshift=\string\szamertek+1.5cm}.

Így az átdolgozott kód a következőképpen néz ki:

\def\szamertek{1cm}

\usepackage{calc} % calc csomag importálása

\begin{tikzpicture}[remember picture,overlay]
    \node[inner sep=0pt, xshift=1.5\linewidth, yshift=\szamertek+1.5cm] at (pic cs:stickit) 
    {\includegraphics[width=.6\linewidth]{valami.eps}};
\end{tikzpicture}
 

Győződj meg arról, hogy a calc csomagot is importálod a dokumentumban, különben a módosított kód nem fog működni.

Ezzel a módosítással a \texttt{yshift} megfelelően kezeli a \texttt{\string\szamertek} dimenziót, és a kód hiba nélkül fut.

\documentclass{article}
\usepackage{tikz}

\listfiles

\begin{document}
\pgfversion
\end{document}


Megnéztem ezzel a csomagverzióimat (2020-as TexLive verziónál megálltam, ez szándékos.)

A fenti kód a logban kiírja a verzióimat:

 *File List*
 article.cls    2019/12/20 v1.4l Standard LaTeX document class
  size10.clo    2019/12/20 v1.4l Standard LaTeX file (size option)
    tikz.sty    2020/01/08 v3.1.5b (3.1.5b)
     pgf.sty    2020/01/08 v3.1.5b (3.1.5b)
  pgfrcs.sty    2020/01/08 v3.1.5b (3.1.5b)
everyshi.sty    2001/05/15 v3.00 EveryShipout Package (MS)
pgfrcs.code.tex
 pgfcore.sty    2020/01/08 v3.1.5b (3.1.5b)
graphicx.sty    2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR)
  keyval.sty    2014/10/28 v1.15 key=value parser (DPC)
graphics.sty    2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR)
    trig.sty    2016/01/03 v1.10 sin cos tan (DPC)
graphics.cfg    2016/06/04 v1.11 sample graphics configuration
   dvips.def    2017/06/20 v3.1d Graphics/color driver for dvips
  pgfsys.sty    2020/01/08 v3.1.5b (3.1.5b)
pgfsys.code.tex
pgfsyssoftpath.code.tex    2020/01/08 v3.1.5b (3.1.5b)
pgfsysprotocol.code.tex    2020/01/08 v3.1.5b (3.1.5b)
  xcolor.sty    2016/05/11 v2.12 LaTeX color extensions (UK)
   color.cfg    2016/01/02 v1.6 sample color configuration
pgfcore.code.tex
pgfcomp-version-0-65.sty    2020/01/08 v3.1.5b (3.1.5b)
pgfcomp-version-1-18.sty    2020/01/08 v3.1.5b (3.1.5b)
  pgffor.sty    2020/01/08 v3.1.5b (3.1.5b)
 pgfkeys.sty    
pgfkeys.code.tex
 pgfmath.sty    
pgfmath.code.tex
pgffor.code.tex
tikz.code.tex
l3backend-dvips.def    2020-03-12 L3 backend support: dvips
 ***********

10-féle lény van:
-- aki ismeri a bináris számrendszert,
-- és amelyik nem.

Nem, az a gép, amin azt akarom elérni, hogy forduljon le.
(Ha hazaérek, megnézem a verziószámok esetleges eltérését azon a gépen, ami régi ugyan, de hibátlan rajta a TexLive)

10-féle lény van:
-- aki ismeri a bináris számrendszert,
-- és amelyik nem.

Szerkesztve: 2023. 05. 23., k – 14:48

A fenti tikz-es node-os anomália kiakasztott, átírtam a kódot oly módon, hogy a paraméteres indítások megmaradjanak, ne kelljen mindenütt átírnom semmit, csak egyetlen helyen.

Szóval tikz-node helyett itt a friss Overpic csomag. Rövidebb, átláthatóbb minden, layeres kezelés is rendben.

 

\def\fejnyitooo#1#2#3#4{
%
% léniába a dátum beillesztése:
\def \honaplenia{\ev{#1}. \roma{#2}. \ev{#3}.}
%
\FloatBarrier 
%
\IfFileExists{./lapvegi-toresek/lapvege-#1-#2-#3}{\input{./lapvegi-toresek/lapvege-#1-#2-#3}}{}
%
%
\noindent
\def\filenametovegeps{#1-#2-#3-1.eps}
\phantomsection
\addcontentsline{toc}{section}{\cim}
%
\vspace{\elottehezag} %címblokk előtti hely

\noindent
\begin{Overpic}[abs,unit=1mm,grid=true,tics=5]{%
		\put(135,5) {\IfFileExists{kepek/#1-#2-#3.eps}{\includegraphics[width=\nyitokepnagyitas\linewidth]{kepek/#1-#2-#3}\kepszamlalo}{\includegraphics[width=\nyitokepnagyitas\linewidth,height=20ex]{example-image}}   
    }
		\put(0,40){#4}
		\put(55,90){\small\specdatum{#1}{#2}{#3}\cimelottihely}
		\put(0,85){\hbox{\tikz\shade[left color=black,right color=white] (0,0) rectangle (\csikhossz\columnwidth,0.4pt);}}
		\put(0,75){\small\textsc{\cim}}
	}%
\end{Overpic}
}

uzsoltnak és mindenkinek köszönöm a segítséget.

------
Szerk: ...és a soregyen is megjavul, amit a TeX-nél tartani egy külön tudomány. (Ez volt a soregyennel az utolsó anomália, ezzel még az is le van tudva.)

10-féle lény van:
-- aki ismeri a bináris számrendszert,
-- és amelyik nem.