始めまして.
pagerefを同一ページでは表示しないマクロを奥村先生が作っていらっしゃる
のを知り,コピペして使わせてもらおうと思いましたが,うまくいきません.
PCの環境,エラーメッセージ,ソースコードを下に貼り付けました.
TeXLive2022とPCの組み合わせが原因かと思い,MacMini(intel CPU)で
TeXLive2019でコンパイルすると,うまくいきます.
何か解決策はないかアドバイス頂けないでしょうか?よろしくお願いします.
%%% PC環境 %%%
MacBook Pro(Apple M2, Ventura13.2.1)
%%%% エラーメッセージ %%%
This is ptex2pdf[.lua] version 20200520.0.
Processing test.tex
This is e-pTeX, Version 3.141592653-p4.0.0-220214-2.6 (utf8.euc) (TeX Live 2022) (preloaded format=platex)
restricted \write18 enabled.
entering extended mode
(./test.tex
pLaTeX2e <2023-02-14> (based on LaTeX2e <2022-11-01> patch level 1)
L3 programming layer <2023-02-22>
(/usr/local/texlive/2022/texmf-dist/tex/platex/jsclasses/jsarticle.cls
Document Class: jsarticle 2023/02/23 jsclasses (okumura, texjporg)
(/usr/local/texlive/2022/texmf-dist/tex/platex/jsclasses/jslogo.sty))
(/usr/local/texlive/2022/texmf-dist/tex/latex/l3backend/l3backend-dvips.def)
(./test.aux)
./test.tex:19: Missing number, treated as zero.
\xparse function is not expandable
l.19 ...号は\ref{初めの節}で,\whichpage{初めの節}
です.
%%% ソースファイル %%%%
¥documentclass{jsarticle}
¥makeatletter%
¥def¥whichpage#1{%
¥expandafter¥ifx¥csname r@#1¥endcsname¥relax%
¥else%
¥@tempcnta¥pageref{#1}¥relax%
¥advance¥@tempcnta-¥c@page%
¥ifnum¥@tempcnta=0%
このページ
¥else%
¥pageref{#1}ページ%
¥fi%
¥fi%
}%
¥makeatother%
¥begin{document}
¥section{初めの節}
¥label{初めの節}
この節番号は¥ref{初めの節}で,¥whichpage{初めの節}です.
次の節番号は¥ref{次の節}で.¥whichpage{次の節}です.
¥newpage
¥section{次の節}
¥label{次の節}
前の節番号は¥ref{初めの節}で,¥whichpage{初めの節}です.
この節番号は¥ref{次の節}で.¥whichpage{次の節}です.
¥end{document}
最近の本家 LaTeX (LaTeX2e 2022-06-01) において
\pageref が \NewDocumentCommand で定義されるようになったため
「カウンタ = \pageref{ラベル}」
という書式で数値取得する手が封じられたそうです。
(マクロ内の \@tempcnta\pageref{#1}\relax% という部分がそれ)
もともと \ref や \pageref で数値取得できていたのは偶然だと思います。
https://github.com/texjporg/platex/issues/57
ちなみに「エラーが出ないけど意図しない結果になる例」とかも
できてしまうので,注意が必要ですね。
以下のソースは最新の LaTeX だと期待に反して EVEN になってしまいます。
(古い版に巻き戻すと期待どおり ODD になる)
%\RequirePackage[2022/05/01]{latexrelease}
\documentclass{article}
\begin{document}
\section{First}\label{sec}
\ifodd0\pageref{sec}-ODD-\else-EVEN-\fi
\end{document}
\pageref が \NewDocumentCommand で定義されるようになったため
「カウンタ = \pageref{ラベル}」
という書式で数値取得する手が封じられたそうです。
(マクロ内の \@tempcnta\pageref{#1}\relax% という部分がそれ)
もともと \ref や \pageref で数値取得できていたのは偶然だと思います。
https://github.com/texjporg/platex/issues/57
ちなみに「エラーが出ないけど意図しない結果になる例」とかも
できてしまうので,注意が必要ですね。
以下のソースは最新の LaTeX だと期待に反して EVEN になってしまいます。
(古い版に巻き戻すと期待どおり ODD になる)
%\RequirePackage[2022/05/01]{latexrelease}
\documentclass{article}
\begin{document}
\section{First}\label{sec}
\ifodd0\pageref{sec}-ODD-\else-EVEN-\fi
\end{document}
早速,お返事ありがとうございます.
https://github.com/texjporg/jsclasses/issues/78
に書いてくださったコードをコピペしたら,うまくいきました.
ありがとうございます.
ただ,有益な説明をしていただいたものと思いますが,私には理解できません.
勉強して理解できるようになるといいのですが,程遠い感じがします.
兎に角,うまくいきました.本当に,ありがとうございました.
%%% コピペしたコード %%%
¥documentclass{jsarticle}
¥makeatletter%
¥@ifl@t@r¥fmtversion{2022/06/01}
{¥def¥okumacro@ref@exp{¥let¥pageref¥@kernel@pageref@exp
¥let¥ref¥@kernel@ref@exp}}
{¥def¥okumacro@ref@exp{¥def¥@setref##1##2##3{%
¥ifx##1¥relax¥z@¥else¥expandafter##2##1¥fi}}}
¥def¥whichpage#1{%
¥okumacro@ref@exp
¥expandafter¥ifx¥csname r@#1¥endcsname¥relax%
¥else%
¥@tempcnta¥pageref{#1}¥relax%
¥advance¥@tempcnta-¥c@page%
¥ifnum¥@tempcnta=0%
このページ
¥else%
¥pageref{#1}ページ%
¥fi%
¥fi%
}%
¥makeatother%
¥begin{document}
¥section{初めの節}
¥label{初めの節}
この節番号は¥ref{初めの節}で,¥whichpage{初めの節}です.
次の節番号は¥ref{次の節}で.¥whichpage{次の節}です.
¥newpage
¥section{次の節}
¥label{次の節}
前の節番号は¥ref{初めの節}で,¥whichpage{初めの節}です.
この節番号は¥ref{次の節}で.¥whichpage{次の節}です.
¥end{document}
https://github.com/texjporg/jsclasses/issues/78
に書いてくださったコードをコピペしたら,うまくいきました.
ありがとうございます.
ただ,有益な説明をしていただいたものと思いますが,私には理解できません.
勉強して理解できるようになるといいのですが,程遠い感じがします.
兎に角,うまくいきました.本当に,ありがとうございました.
%%% コピペしたコード %%%
¥documentclass{jsarticle}
¥makeatletter%
¥@ifl@t@r¥fmtversion{2022/06/01}
{¥def¥okumacro@ref@exp{¥let¥pageref¥@kernel@pageref@exp
¥let¥ref¥@kernel@ref@exp}}
{¥def¥okumacro@ref@exp{¥def¥@setref##1##2##3{%
¥ifx##1¥relax¥z@¥else¥expandafter##2##1¥fi}}}
¥def¥whichpage#1{%
¥okumacro@ref@exp
¥expandafter¥ifx¥csname r@#1¥endcsname¥relax%
¥else%
¥@tempcnta¥pageref{#1}¥relax%
¥advance¥@tempcnta-¥c@page%
¥ifnum¥@tempcnta=0%
このページ
¥else%
¥pageref{#1}ページ%
¥fi%
¥fi%
}%
¥makeatother%
¥begin{document}
¥section{初めの節}
¥label{初めの節}
この節番号は¥ref{初めの節}で,¥whichpage{初めの節}です.
次の節番号は¥ref{次の節}で.¥whichpage{次の節}です.
¥newpage
¥section{次の節}
¥label{次の節}
前の節番号は¥ref{初めの節}で,¥whichpage{初めの節}です.
この節番号は¥ref{次の節}で.¥whichpage{次の節}です.
¥end{document}
LaTeX の範囲でやってみた。
\usepackage{ifthen,calc}
\newcounter{myprevpage}
\newcounter{mynextpage}
\newcommand{\mywhichpage}[1]{%
\setcounter{myprevpage}{\value{page}-1}%
\setcounter{mynextpage}{\value{page}+1}%
\ifthenelse{\pageref{#1} = 0}{%
\textbf{??}ページ%
}{%
\ifthenelse{\pageref{#1} = \arabic{page}}{%
このページ%
}{%
\ifthenelse{\pageref{#1} = \arabic{myprevpage}}{%
前のページ%
}{%
\ifthenelse{\pageref{#1} = \arabic{mynextpage}}{%
次のページ%
}{%
\pageref{#1}ページ%
}%
}%
}%
}%
}
ifthen パッケージの \ifthenelse
命令では \ref
, \pageref
が展開可能になっている。
そもそも page カウンタでは現在のページを取得できるとは限らないという話は置いておく。 (参考:>LaTeXで現在のページ番号を取得・出力する話 - Qiita)