![Comando de teorema especial](https://rvso.com/image/286987/Comando%20de%20teorema%20especial.png)
Meu objetivo nas últimas questões foi definir um comando muito flexível que permitisse a definição de teoremas de vários tipos. A razão para isso foi ter um único comando basicamente para todos os tipos de teoremas, ambos já usados e nunca usados antes, para evitar que ambos tivessem que definir muitos tipos de teoremas, incluindo alguns que eu usaria uma vez na vida e nunca mais, e ter que colocar o nome de um teorema especial entre colchetes como [name=foo]
, que resulta em (foo). Outra coisa útil sobre este comando da forma como o defini é que ele permite flexibilidade na exibição do contador, permitindo que teoremas do mesmo "tipo" (ou seja, Teoremas, Definições, etc.) sejam numerados às vezes como [section]
, às vezes como [subsection]
, às vezes as [chapter]
, dependendo da subdivisão da localização do teorema, evitando assim zeros [subsection]
onde não há divisão de subseção, e ter que defini-lo como [section]
quando às vezes eu gostaria que fosse definido como [subsection]
porque EXISTE tal subdivisão. No momento o comando está como no código mínimo abaixo:
\documentclass[a4paper]{report}
\usepackage{amsmath,amssymb,amsfonts,xparse,amsthm,mathptmx}
\makeatletter
\newtheorem*{@thmattr}{\theorem@attr}
\NewDocumentEnvironment{thmattr}{moO{x}oo}
{\IfNoValueTF{#2}
{\def\theorem@attr{#1}}
{\@ifundefined{c@#2}
{\newcounter{#2} \setcounter{#2}{1}}
{\addtocounter{#2}{+1}}
\def\counters{\if #3c
\arabic{chapter}.\arabic{#2}
\else{
\if #3s
\arabic{chapter}.\arabic{section}.\arabic{#2}
\else{
\if#3x
\arabic{chapter}.\arabic{section}.\arabic{subsection}.\arabic{#2}
\else
\errmessage{Illegal argument in counter definition}
\errhelp{The third argument must be either c, s or x, for chapter, section and subsection respectively}
\fi}
\fi}
\fi}\def\theorem@attr{#1\ \counters}}
\IfNoValueTF{#4}
{\begin{@thmattr}}
{\IfNoValueTF{#5}
{\begin{@thmattr}[\textbf{#4}]}
{\begin{@thmattr}[\textbf{#4}\label{#5}]}}}
{\end{@thmattr}}
\makeatother
\begin{document}
\begin{thmattr}{Teorema della Palla Pelosa}
\end{thmattr}
\begin{thmattr}{Teorema}[teor][x]
\end{thmattr}
\begin{thmattr}{Esercizio Imperiano}[eseese][c]
\end{thmattr}
\begin{thmattr}{Definizione}[defi][s][Estensione algebrica][thm:defi:EstAlg]
\end{thmattr}
\begin{thmattr}{Sorrata}[mu][c][Estensione algebrica]
\end{thmattr}
\end{document}
quais composições para:
Meus problemas são:
1) Se eu usar thmtools
, recebo um erro undefined control sequence: \thmt@thmname->\theorem@attr
(ou algo parecido), mas sem ele, como no código acima, os colchetes ao redor do nome não ficam em negrito e o nome é forçado a ficar em negrito, enquanto com thmtools
eu ficaria ambos automaticamente em negrito; tem como tirar o negrito sem thmtools
ou resolver o erro thmtools
dá? E se o erro thmtools
não puder ser resolvido, existe uma maneira de fazer \listoftheorems
sem esse pacote?
2) Usar \if
para comparar os argumentos causa problemas quando o argumento é uma string; Gostaria de enviar uma mensagem de erro se o argumento for uma string em vez de um único caractere, de modo que se minha mão escorregar no teclado e em vez de c eu digitar, por exemplo, cv, recebo um erro e corrijo isso; como faço isso? NB, isso foi metade da pergunta emhttps://tex.stackexchange.com/questions/167513/special-conditionals-tex.
3) Um teorema com contador mas sem rótulo (Esercizio Imperiano no código tipográfico) tem um espaço bastante feio entre o contador e o ponto; como faço para remover isso? Como alternativa, como removo o ponto, se possível? E por que o espaço entre o nome do teorema e os contadores, bem como entre os contadores e o ponto, parece variar em comprimento dependendo do número de contadores?
Atualizar: Conforme mencionado em um comentário, o problema um está resolvido. A solução, entretanto, transforma o ponto em dois pontos de aparência ainda pior e cria o problema dos colchetes ao redor dos nomes na Lista de Teoremas. Como faço para resolver isso? O mesmo conjunto de teoremas, mais algo digitado no primeiro, com o seguinte código:
\makeatletter
\declaretheoremstyle[
spaceabove=\topsep, spacebelow=\topsep,
headfont=\normalfont\bfseries,
notefont=\bfseries, notebraces={}{},
bodyfont=\normalfont\itshape,
postheadspace=0.5em,
name={\ignorespaces},
numbered=no,
headpunct=:]
{mystyle}
\declaretheorem[style=mystyle]{@thmattr}
\NewDocumentEnvironment{thmattr}{moO{x}oo}
{\IfNoValueTF{#2}
{\def\theorem@attr{#1}}
{\@ifundefined{c@#2}
{\newcounter{#2} \setcounter{#2}{1}}
{\addtocounter{#2}{+1}}
\def\counters{\if #3c
\arabic{chapter}.\arabic{#2}
\else{
\if #3s
\arabic{chapter}.\arabic{section}.\arabic{#2}
\else{
\if#3x
\arabic{chapter}.\arabic{section}.\arabic{subsection}.\arabic{#2}
\else
\errmessage{Illegal argument in counter definition}
\errhelp{The third argument must be either c, s or x, for chapter, section and subsection respectively}
\fi}
\fi}
\fi}\def\theorem@attr{#1\counters}}
\IfNoValueTF{#4}
{\begin{@thmattr}[\theorem@attr]}
{\IfNoValueTF{#5}
{\begin{@thmattr}[\theorem@attr (#4)]}
{\begin{@thmattr}[\theorem@attr (#4)\label{#5}]}}}
{\end{@thmattr}}
\renewcommand\thmt@listnumwidth{-1.5em}
\makeatother
produz:
Responder1
O problema 1 tem solução emEstilo de teorema com nome como argumento, observando que deve-se usar [headpunct=]
para remover o ponto/dois pontos/qualquer coisa após o nome do teorema.
O problema 2 tem uma resposta em \str_if_eq:nnTF
um comentário emProblema com abreviatura de `\multirow` e `\multicolumn` (LaTeX).
Quanto ao problema de espaçamento no problema 3, parece ter simplesmente desaparecido com a solução do problema 1, o que é uma felicidade.
O único problema é que, além de uma forma de escolher quais teoremas mostrar e ignorar no \listoftheorems
, o que pode ser facilmente resolvido duplicando o comando com outro nome, ou de fato adicionando outro argumento para decidir que tipo de mystyle
teorema usar, o \listoftheorems
mostra colchetes ao redor dos nomes dos teoremas e, claro, tem os contadores no meio do nome. Gostaria de saber se é possível retirar os colchetes (problema maior) e definir um rótulo diferente para a lista nessa bagunça (problema menor). Na verdade, o "problema menor" tem uma solução fácil: basta usar [{name=[<list name>]<page name>}]
(implementado oportunamente no thmattr
ambiente complexo), embora pensando nisso eu talvez não queira isso.
De qualquer forma, esta resposta serve para dois propósitos:
1) Resumir a solução que obtive a partir de várias perguntas e comentários e de uma única pesquisa em um ponto claro da página desta pergunta, e
2) Link para a nova questão que irá (ou pode) resolver as questões restantes, que está emPersonalizando lista de teoremas