Jak można zmodyfikować środowisko longtable, aby stworzyć środowisko longquadro?

Nov 28 2020

Aby nadać kontekst: mam długą listę zagrożeń, które chcę umieścić w moim dokumencie i udało mi się sprawić, by działała, longtablejak widać na rys. 1 (jest w języku portugalskim, ponieważ jest to moja rozprawa mistrzowska).

Problem, z którym mam tutaj do czynienia, polega na tym, że longtables są zawsze rozpoznawane jako tabele i chciałbym móc użyć niestandardowej nazwy zmiennoprzecinkowej quadro, która jest tworzona jako część używanego szablonu, który jest zdefiniowany poniżej:

\newcommand{\listquadroname}{Lista de quadros}
\newcommand{\quadroname}{Quadro}
\newcommand{\quadrorefname}{Quadro}
\newcommand{\chartautorefname}{Quadro}

\addto\captionsenglish{% ingles
    \renewcommand{\listquadroname}{List of charts}
    \renewcommand{\quadroname}{Chart}
    \renewcommand{\quadrorefname}{Chart}
    \renewcommand{\chartautorefname}{Chart}
}

\newfloat{quadro}{htbp}{loq}[chapter]
\floatname{quadro}{\quadroname}
\floatstyle{plaintop}
\restylefloat{quadro}
\newlistof{listofquadros}{loq}{\listquadroname}
\newlistentry{quadro}{loq}{0}
\renewcommand{\thequadro}{\thechapter.\@arabic\c@quadro}
\setfloatadjustment{quadro}{\centering}

\renewcommand{\cftquadroname}{\quadroname\space}
\renewcommand*{\cftquadroaftersnum}{\hfill\textendash\hfill}

\begin{quadro}[htb]
\caption{Editores de Texto Livres}
\label{quadro:editores_texto_livres}
\centering
\begin{tabular}{|l|l|r|}        \hline
Editor     & Multiplataforma & Específico para Latex \\ \hline
Kwriter    & Sim             & Não                   \\
Texmaker   & Sim             & Sim                   \\
Kile       & Sim             & Sim                   \\
Geany      & Sim             & Não                   \\ \hline
\end{tabular}
\end{quadro}

Biorąc to pod uwagę, jak mogę edytować longtableśrodowisko, aby stworzyć longquadrośrodowisko, które nie tylko jest zgodne z tą samą konwencją nazewnictwa, ale także jest zawarte na tych samych listach (jak Lista Quadros).

Odpowiedzi

2 muzimuzhiZ Nov 28 2020 at 04:57

Ponieważ jest to pytanie uzupełniające, próbując użyć tabeli longtable, aby obejmowała wiele stron, ale nie mogę kontrolować, do której listy trafi , poniższy przykład jest również oparty na odpowiedzi podanej w odpowiedzi (opublikowanej przeze mnie) .

Ogólne notatki:

  • Kluczem jest wykonanie łatek lokalnie w środowisku longquadro.
  • Aby uniknąć problemu zagnieżdżania się \xpatchcmd\cmd{<... containing #1>}{}{<true>}{<false>}wewnątrz makra, \LT@c@ptionjest bezpośrednio redefiniowana, a nie łatana.
% for https://tex.stackexchange.com/q/572654/79060
\documentclass{report}

\usepackage[strut=off]{caption}
\usepackage{float}
\usepackage{longtable}
\usepackage{xpatch}

\newcommand{\listquadroname}{Lista de quadros}
\newcommand{\quadroname}{Quadro}
\newcommand{\quadrorefname}{Quadro}
\newcommand{\chartautorefname}{Quadro}

\newfloat{quadro}{htbp}{loq}[chapter]
\floatname{quadro}{\quadroname}
\floatstyle{plaintop}
\restylefloat{quadro}

\makeatletter
\renewcommand{\thequadro}{\thechapter.\@arabic\c@quadro}

% define env "longquadro"
\newenvironment{longquadro}
  {\patch@longtable@i\patch@longtable@ii
   \longtable}
  {\endlongtable}

% patching codes base on https://tex.stackexchange.com/a/548021
\newcommand\patch@longtable@i{%
  \xpatchcmd\ltcaption@ORI@LT@array
    {\refstepcounter{table}}
    {\refstepcounter{quadro}}
    {}{\fail}%
}

% since "\@ifpackageloaded" is preamble only, the patching codes have to
% be split in two macros
\@ifpackageloaded{caption}{
  % handle compatibility with caption package
  \newcommand\patch@longtable@ii{%
    \renewcommand\LTcaptype{quadro}%
  }
}{
  \newcommand\patch@longtable@ii{%
    % derectly redefine "\LT@c@ption"
    \def\LT@c@ption##1[##2]##3{%
      \LT@makecaption##1\fnum@quadro{##3}%
      \def\@tempa{##2}%
      \ifx\@tempa\@empty\else
         {\let\\\space
         \addcontentsline{loq}{quadro}{\protect\numberline{\thequadro}{##2}}}%
      \fi}%
  }
}
\makeatother


\begin{document}
\listoftables
\listof{quadro}{\listquadroname}

\chapter{title}

\begin{table}[htb]
  \caption{This is s table title}
\end{table}

\begin{quadro}[htb]
  \caption{This is a quadro title}
\end{quadro}

\begin{longtable}{cc}
  \caption{This is a longtable title} \\
  a & b \\
  c & d
\end{longtable}

\begin{longquadro}{cc}
  \caption{This is a longquadro title} \\
  a & b \\
  c & d
\end{longquadro}
\end{document}

3 egreg Nov 28 2020 at 04:57

To powinno działać:

\documentclass{abntex2}

\usepackage{float}
\usepackage{longtable}
\usepackage{xpatch}

%%changed to make generic
\providecommand{\listquadroname}{}
\providecommand{\quadroname}{}
\providecommand{\quadrorefname}{}
\providecommand{\chartautorefname}{}

\addto\captionsbrazil{%
  \renewcommand{\listquadroname}{Lista de quadros}%
  \renewcommand{\quadroname}{Quadro}%
  \renewcommand{\quadrorefname}{Quadro}%
  \renewcommand{\chartautorefname}{Quadro}%
}

\addto\captionsenglish{%
  \renewcommand{\listquadroname}{List of charts}%
  \renewcommand{\quadroname}{Chart}%
  \renewcommand{\quadrorefname}{Chart}%
  \renewcommand{\chartautorefname}{Chart}%
}
%%%

\newfloat{quadro}{htbp}{loq}% <--- changed
\counterwithin{quadro}{chapter}% <--- added
\floatname{quadro}{\quadroname}
\floatstyle{plaintop}
\restylefloat{quadro}
\newlistof{listofquadros}{loq}{\listquadroname}
\newlistentry{quadro}{loq}{0}
\renewcommand{\thequadro}{\thechapter.\arabic{quadro}}% <--- changed
\setfloatadjustment{quadro}{\centering}

\renewcommand{\cftquadroname}{\quadroname\space}
\renewcommand*{\cftquadroaftersnum}{\hfill\textendash\hfill}

\makeatletter
\newenvironment{longquadro}
 {%
  \let\c@table\c@quadro\let\thetable\thequadro
  \def\fnum@table{\quadroname{ }\thequadro}%
  \xpatchcmd{\NRorg@LT@c@ption}{{lot}{table}}{{loq}{quadro}}{}{}%
  \xpatchcmd{\NRorg@LT@c@ption}{{lot}{table}}{{loq}{quadro}}{}{}%
  \renewcommand{\theHtable}{quadro\thechapter.\arabic{quadro}}%
  \longtable
 }
 {\endlongtable}
\makeatother

\begin{document}

\listofquadros

\chapter{First}

\begin{quadro}[htp]
\caption{Test}
\end{quadro}

\begin{longquadro}{|l|l|r|}
\caption{Editores de Texto Livres}
\label{quadro:editores_texto_livres}\\
\hline
Editor     & Multiplataforma & Específico para Latex \\ \hline
Kwriter    & Sim             & Não                   \\
Texmaker   & Sim             & Sim                   \\
Kile       & Sim             & Sim                   \\
Geany      & Sim             & Não                   \\ \hline
\end{longquadro}

\end{document}

Sprawdź zmiany, które wprowadziłem w Twoim kodzie.