Переосмислення \ розділу означає \ секція *

aidangallagher4 10/04/2017. 3 answers, 245 views
macros

Мені шкода, якщо це дублікат, однак я ніби не міг знайти точну відповідь на це скрізь. Я ввожу папір в LaTeX, і для полегшення набору тексту (хоча і не так вже й точно), я хотів би перевизначити команду \section щоб не вказати номери секцій (тобто така ж, як \section* ).

Спочатку я наївно намагався \renewcommand{\section}{\section*} , але, звичайно, це призвело до нескінченної рекурсії (оскільки \section* визначається за допомогою \section ), так і не спрацював. Далі, зробивши трохи досліджень, виявилося, що я можу обійти це, роблячи (у преамбулі):

\let\oldsection\section*
\renewcommand{\section}{\oldsection} 

Однак це повернуло помилку:

! LaTeX Error: Missing \begin{document}.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H   for immediate help.
 ...                                              

l.13 \let\oldsection\section* 

Я вважаю, що помилка пов'язана з використанням \section* у команді \let allow, але я не знаю точно, що неправильно.

Я знаю, що зможу розібрати це, зробивши це:

\let\oldsection\section
\renewcommand{\section*}{\oldsection} 

однак я відчуваю, що це не в дусі лінивості, яке мене почало в цьому, і я хотів би (якщо це можливо) рішення, яке досі дає мені можливість використовувати \section що є оптимальним.

Я підозрюю, що рішення може полягати в перевизначенні правил нумерації для \section (що було б добре, але не ідеально), однак будь-яка допомога дуже цінується!

5 Comments
Christian Hupfer 10/04/2017
* насправді не відноситься до імені макросу \section , це аргумент для \section тут, а \let\origsection\section* залишає * у потоці введення, викликаючи помилку
4 Ulrike Fischer 10/04/2017
Чому б тобі просто не змінювати протилежне secnumdepth?
1 David Carlisle 10/04/2017
@UlrikeFischer ви можете опублікувати це як відповідь :-)
Ulrike Fischer 10/04/2017
@ DavidCarlisle Готово.
1 Werner 10/04/2017
Це XY-проблема : Різне питання, з аналогічним рішенням як видалити нумерацію з розділу та підсекції (можливий дубльований файл).

3 Answers


Christian Hupfer 10/04/2017.

* не є частиною назви макросу, це аргумент ефективний - макроси, які мають версію із зірочкою, використовують \@ifstar щоб перевірити, чи є наступний токен * та гілкою в інший макрос, який виконує очікувану операцію для версії із зірочкою та інший для макросів з незміром.

\let\origsection\section зберігає старе визначення, версію тут діє
завжди для \oldsection* версії.

\documentclass{article}

\let\origsection\section

\makeatletter

\renewcommand{\section}{%
  \@ifstar{%
    \origsection*%
  }{%
    \origsection*%
  }%
}

\makeatother

\begin{document}

\section{Foo}

\section*{Foo again}

\end{document} 
5 comments
aidangallagher4 10/04/2017
Дуже спасибі це те, що я шукав; чи можна було б пояснити, як цей код працює для додаткових кедосів?
alephzero 10/04/2017
Це "працює", але встановлення secnumdepth (як і в іншому відповідь) є кращим способом вирішення вашої проблеми.
Christian Hupfer 10/04/2017
@alephzero: better це бачення думки ;-) Моя версія корисна для випадків, коли secnumdepth не має на увазі, тобто коли інші команди, окрім макросів структури, повинні поводитися як їх зірочкова версія
Christian Hupfer 10/04/2017
@ aidangallagher4: будь ласка, не приймайте відповіді. Я, скоріше, видалив мою відповідь, ніж тримав його таким чином
aidangallagher4 10/04/2017
На ризик участі в цьому чітко партизанському питанні я збираюся дотримуватися моїх знарядь і зберігати вашу відповідь як вибраний, тому що з причин, з якими ви і я вже виклали, я вважаю, що це найкраще відповідає моєму питанню . Питання, пов'язані з естетикою, дуже суб'єктивні, і, безсумнівно, кожна людина має свою думку, однак, враховуючи, що це моє питання (хоча моя кількість очок блідий порівняно з будь-яким іншим тут), я збираюся прийняти виконавче рішення тут

Ulrike Fischer 10/04/2017.

Я хотів би встановити secnumdepth якщо я хочу безлімітні розділи:

\documentclassNO 

введіть опис зображення тут

2 comments
aidangallagher4 10/04/2017
Підніміться за найкоротший шлях!
6 David Carlisle 10/04/2017
@ aidangallagher4 це теж рішення, яке слід прийняти. (Християнин не проти відмовитися від свого тика до леді :-)

koleygr 10/04/2017.

Спробуйте це:

https://tex.stackexchange.com/a/380116/120578

Спеціально для ваших потреб це може бути як:

\let\oldsection\section
\makeatletter
\def\msection{%
\@ifstar{\@Starred}{\@nonStarred}%
}
\def\@Starred{%
\@ifnextchar[%
{\GenericWarning{}{Warning: A starred section can not have optional parameters. I am going to ignore them!}\@StarredWith}%
{\@StarredWithout}%
}      
\def\@StarredWith[#1]#2{%
\oldsection*{#2}%
}
\def\@StarredWithout#1{
\oldsection*{#1}%
}
\def\@nonStarred{%
\@ifnextchar[%
{\@nonStarredWith}%
{\@nonStarredWithout}%
}
\def\@nonStarredWith[#1]#2{%
\oldsection*{#2}%
}
\def\@nonStarredWithout#1{%
\oldsection*{#1}%
}
\makeatother 
2 comments
Christian Hupfer 10/04/2017
Чи не так складно?
koleygr 10/04/2017
@ ChristianHupfer Я щойно змінив код посилання. Я міг би просто залишити нестандартну і викликати знімок ... Але я залишив це так, якщо хтось хоче зробити щось більше в будь-якому випадку (відрізняється для зірочливої ​​або нестандартної тощо). Вона має ту перевагу, що приймає розділ Starred з необов'язковим аргументом (цей OP, як видається, потрібний), мій код просто ігнорує його, але може використовувати його для fancyhead або будь-якого іншого. Тому я думаю, що код посилання не надто складний, але майже мінімальний необхідний, що дає можливість подбати про всі можливості і робити все, що завгодно, з розділами.

Related questions

Hot questions

Language

Popular Tags