whichpageマクロが動きません

whichpageマクロが動きません

- vex cuesta の投稿
返信数: 5
始めまして.

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}

vex cuesta への返信

Re: whichpageマクロが動きません

- aminophen の投稿
最近の本家 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}
aminophen への返信

Re: whichpageマクロが動きません

- aminophen の投稿
\whichpage が okumacro パッケージに収録されている命令なので
https://github.com/texjporg/jsclasses/issues/78 を立てました。
aminophen への返信

Re: whichpageマクロが動きません

- vex cuesta の投稿
早速,お返事ありがとうございます.

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}
vex cuesta への返信

Re: whichpageマクロが動きません

- はやて (h20y6m) の投稿

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

はやて (h20y6m) への返信

Re: whichpageマクロが動きません

- vex cuesta の投稿
はやて様,

ifthen パッケージというのがあるのですね.これも試しましたが,うまくいきました.
ありがとうございました.

@の使い方がわからない初心者の私には,これなら理解できました.
@の使い方も理解できるようになりたいのですが...