Удаление номеров страниц
Word для Microsoft 365 Word для Microsoft 365 для Mac Word для Интернета Word 2021 Word 2021 для Mac Word 2019 Word 2019 для Mac Word 2016 Word 2016 для Mac Word 2013 Word 2010 Word 2007 Word для Mac 2011 Еще. Меньше
Удаление номеров страниц
- Перейдите к разделу Вставка >Номер страницы и выберите команду Удалить номера страниц.
- Если кнопка Удалить номера страниц недоступна или некоторые номера страниц сохранились, дважды щелкните верхний или нижний колонтитул, выделите номер страницы и нажмите клавишу DELETE. Это может потребоваться в документах, содержащих несколько разделов или разные колонтитулы для четных и нечетных страниц. Нажмите кнопку Закрыть окно колонтитулов или дважды щелкните в любом месте за пределами области колонтитулов, чтобы закрыть его.
Удаление номеров страниц
Внимание: Используя этот вариант, вы можете полностью удалить настроенные колонтитулы. Вместо этого откройте верхний или нижний колонтитул, выделите номер страницы и нажмите клавишу DELETE. Чтобы выделить номер страницы, может потребоваться временно переместить объекты, которые его закрывают, или изменить их размер.
- На вкладке Вставка щелкните значок Номер страницы и выберите команду Удалить номера страниц. Если кнопка Удалить номера страниц недоступна, дважды щелкните область верхнего или нижнего колонтитула, выделите номер страницы и нажмите клавишу DELETE.
Нажмите кнопку Закрыть окно колонтитулов или дважды щелкните в любом месте за пределами области колонтитулов, чтобы закрыть его.
- Если вы еще не перешли в режим правки, щелкните Редактировать документ >Изменить в Word в Интернете.
- Выберите Вставка >Номера страниц.
- Выберите команду Удалить номера страниц.
Дополнительные сведения о номерах страниц см. в статье Нумерация страниц в Word.
LibreOffice: Все о нумерации страниц (Часть II)
Статья является продолжением статьи LibreOffice: Все о нумерации страниц (Часть I). В ней идет речь о сложной нумерации страниц в Writer. Простые способы нумерации, в том числе с использованием расширения, описаны в первой части.
Вставка страниц в Writer на первый взгляд кажется чем-то непонятным и весьма странным. Признаюсь, сам не сразу оценил её когда только начинал пользоваться LibreOffice. Но когда уделил этому вопросу немного времени, понял насколько это мощная функция и почему она реализована именно так.
В данной статье собрана исчерпывающая информация по этому вопросу. Некоторые вещи освещены впервые.
В последнее время я совсем не лаконичен и мои статьи содержат много рассуждений (степень Магистра дает о себе знать). Наберитесь терпения и вы будете вознаграждены.
Дурные привычки
Самый главный враг пользователя — это его дурные привычки, доставшиеся ему от Майкрософт Оффис (МСО). Поразительно, что МСО поддерживает грамотную работу с документами, которая мало чем отличается от работы с документами в LibreOffice. Вот только всевозможные руководства (и официальные тоже) умалчивают об этом и прививают пользователям МСО совершенно неправильный подход к созданию документов.
Вернемся к нумерации. В МСО есть специальный диалог для быстрой нумерации страниц. В LibreOffice по умолчанию такого диалога нет, но с помощью плагина Pager вы получите более простой и более мощный инструмент нумерации страниц.
Как ни странно, простая нумерация страниц в МСО и LibreOffice делается одинаково (чего не скажешь о сложной). Я имею ввиду не столько процесс, сколько его реализацию. Диалог нумерации страниц в МСО всего навсего автоматизирует то, что в стандартном LibreOffice делается вручную.
Давайте посмотрим что происходит в МСО под капотом функции нумерации, когда мы вставляем номер страницы:
- К странице добавляется колонтитул.
- В колонтитул вставляется поле (счётчик) с номером страницы.
- Поле с номером выравнивается по нужной стороне.
А теперь сравним это с процессом нумерации в LibreOffice:
- Добавьте верхний или нижний колонтитул (Вставка → Верхний/Нижний Колонтитул).
- Установите курсор в колонтитул и вставьте поле с номером страницы используя Вставка → Поля → Номер страницы.
- С помощью кнопок выравнивания текста расположите номер слева/справа/по центру.
Кстати, если вы проделаете те же действия в МСО (в 03 версии даже пункты меню совпадают), то вы получите совершенно такой же эффект, как и при использовании диалога нумерации страниц.
Больше того, можно воспользоваться функцией Записи макроса [1] и сделать кнопку на панели [2] , которая будет автоматически вставлять нумерацию страниц в соответствии с вашими требованиями.
Казалось бы, раз все сделано одинаково, почему бы не встроить в LibreOffice диалог для быстрой нумерации. И тут ответ прост, читайте следующий раздел.
Шаблоны
Пользователей удивляет, почему в LibreOffice нужно делать на один клик больше. Ведь это так тяжело. Конечно, их главный аргумент в том, что каждый раз вставлять нумерацию таким образом очень утомительно.
И у меня возникает встречный вопрос. А зачем делать это каждый раз? Зачем каждый раз начинать создание документа с чистого листа?
Ленивые пользователи просто создают шаблон документа, в котором один раз задают колонтитулы и нумерацию. Остальные документы просто создаются на основе этого шаблона. Таким образом, используя шаблоны вообще не нужно вставлять нумерацию, так как она там уже есть.
При желании можно изменить стандартный шаблон документа и у вас всегда будет открываться документ с уже проставленной нумерацией. Экономия кликов на лицо.
Справедливости ради, в МСО также можно сделать или изменить стандартный шаблон и тоже экономить клики. Но вместо этого бывшие МСО-пользователи предпочитают писать грязные пасквили в адрес LibreOffice и его разработчиков.
Подобные комментарии лишний раз подтверждают вредность привычек, привитых использованием МСО. Если бы люди правильно использовали весь функционал того же МСО, им бы было гораздо проще привыкнуть к LibreOffice.
Про шаблоны можно дополнительно почитать:
- Использование шаблона для создания документа
- LibreOffice: Изменение стандартного шаблона
Стили страниц
Ещё одна причина недовольства нумерацией страниц в LibreOffice заключается в странном, по версии пользователей, поведении нумерации. То они жалуются, что нумерация сбилась, то нумерация у них пошла заново.
Все это говорит о полном непонимании пользователями основных принципов работы с документами. Ниже пойдет речь о всевозможных трюках с нумерацией и у меня ни разу не возникало никаких проблем.
Вернемся к стилям страниц. Стили страниц вкупе с разрывами позволяют задать отдельные формат нумерации для каждого стиля. Простым примером может служить ситуация, когда имеются правые и левые страницы с выровненными номерами страниц (по правой и левой стороне соответственно).
Стили страниц не хранят информацию непосредственно о самой нумерации, но сохраняют настройки колонтитулов (размер колонтитула, выравнивание).
Также с помощью стиля страницы и разрыва страницы можно сделать нумерацию не по порядку, т.е. за страницей с номером 3 может следовать страница с номером 9.
Кстати, при использовании стиля страницы, которая уже содержит колонтитул, тоже происходит экономия кликов, достаточно только вставить поле с номером.
Один из трюков со стилями и разрывами страницы приведен в статье Изменение ориентации отдельных страниц.
Далее я опишу некоторые приемы работы с нумерацией. Некоторые приемы просто невозможно повторить используя диалог нумерации страниц.
Нумерация не с первой страницы
Допустим, что документ должен начинаться не с 1-й страницы, а с 6-й. Тут есть одна тонкость: Новый номер страницы является атрибутом первого абзаца страницы. [3].
Помните, что я писал в статье Изменение ориентации отдельных страниц в разделе И снова о логике:
Дело в том, что такие программы, как LibreOffice, оперирую абзацами. Абзац первичен, без абзаца нет страницы. Ни в LibreOffice, ни в МС Офис невозможно создать абсолютно пустую страницу. Всегда на новой странице будет находиться мигающий курсор и будет автоматически сделана пустая строка. Да, пустая строка это тоже абзац.
Итак. Чтобы изменить номер первой страницы, необходимо:
- Установить курсор в первом абзаце страницы и открыть диалог настройки Абзаца (Формат → Абзац). Или свойства стиля первого абзаца, если вы пользуетесь стилями абзацев (А я надеюсь, что вы ими пользуетесь). Диалоги Абзац и Свойства стиля Абзаца аналогичны.
- Перейти в диалоге на вкладку Положение на странице.
- Включить в разделе Разрывы маркер Вставить и Со стилем страницы.
- В списке Положение выбрать Перед
- В списке Номер страницы указать желаемый номер.
Внимание! Не используйте смещение для задания нумерации страниц.
Произвольная нумерация
Может понадобится сделать произвольную нумерацию, т.е. сначала будет идти страница с номером 4, потом с номером 11, потом 25. Тут имеется ввиду именно создание произвольной нумерации, а не физическая перестановка страниц.
Это также достигается за счет того, что описано в предыдущем пункте — стили и разрывы.
Не нумеровать первую страницу
Чтобы не нумеровать первую страницу, ей нужно присвоить соответствующий стиль. По умолчанию в LibreOffice есть стиль Первая страница. Но можно сделать свой отдельный стиль страницы.
Далее просто присваиваете первой странице нужный стиль, например, Первая страница. Затем добавляете после неё разрыв страницы с другим стилем, который уже будет содержать колонтитулы.
Чтобы лучше понимать этот процесс, прочитайте статьи Руководство по стилям LibreOffice и Изменение ориентации отдельных страниц. В руководстве по стилям описаны основы работы со стилями, как создавать их и использовать.
Но есть и более простой способ убрать номер с первой страницы. В LibreOffice есть специальный диалог Титульная страница(Формат → Титульная страница).

Он вполне понятен и не требует дополнительных разъяснений. Но я лично его не использую, так как делаю всё с помощью стилей. По сути, данный диалог просто автоматизирует процесс.
Смешанный тип нумерации
Во многих иностранных учебниках, а иногда и в русскоязычных, встречается смешанная нумерация. Например, страницы с оглавлением нумеруются в стиле i, ii, iii и т.д., а страницы с основным текстом уже идут с арабской нумерацией. Это только малая часть возможных форматов нумерации.
Опять же, достигается это за счёт использования стилей страницы и разрывов.
Поясню на примере. Для руководств я обычно создаю следующие стили страниц:
- Титульная (без колонтитулов и нумерации)
- Импрессум (без колонтитулов и нумерации)
- Оглавление (с колонтитулом и нумерацией)
- Правая (с колонтитулом и нумерацией)
- Левая (с колонтитулом и нумерацией)
Титульная страница идет первой, за ней через разрыв идет страница со стилем Импрессум (страница с выходными сведениями). Потом через разрыв добавляю страницы со стилем Оглавление.
Стиль Оглавление содержит колонтитулы в которых добавляю номер страницы. Теперь, чтобы изменить стиль нумерации нужно дважды нажать на номер страницы. Откроется диалог Редактирование полей. В поле Формат выберите нужный формат нумерации (в нашем случае римские).

Теперь главный нюанс. Все последующие страницы со стилем Оглавление будут иметь именно такой тип нумерации.
После оглавления через разрыв вставляется стиль страницы Левая. В колонтитул страницы вставляется поле с номером страницы в арабском формате. Номер выравнивается по левому краю.
И тут другой нюанс. В свойствах стилей можно указать параметр Следующий стиль. Т.е., например, следующий стиль у стиля Импрессум стоит также Импрессум, так как оглавление генерируется автоматически и может занимать несколько страниц.
У стиля Левая следом автоматически идет страница со стилем Правая, а у правой следом идет страница со стилем Левая. В данном случае разрывы не нужны, так как стиль меняется автоматически. Подробнее о свойстве Следования (не путать с Наследованием) читайте в Руководстве по стилям LibreOffice.
У страницы со стилем Правая номер выравнивается по правой стороне и может быть в другом формате (но в нашем случае формат совпадает с Левой страницей).
Таким образом, мы имеем следующее положение дел. У всех страниц со стилем страниц Импрессум нумерация страниц идет в римском формате. У всех страниц со стилем Левый страницы нумеруются в арабском формате. У всех страниц со стилем Правый могут идти в другом формате.
Абсолютное незнание свойств стилей страниц большинством пользователей приводит к разного рода проблемам. Им кажется, что LibreOffice сошел с ума и творит всякий бред. На деле же проблема, как обычно, в самих пользователях.
Чтобы ознакомиться на примере, изучите мой шаблон для технической документации. Скачать его можно здесь.
Смещение
В диалоге Редактирование полей, о котором сказано в предыдущем пункте, есть параметр смещение. Он может влиять на нумерацию страниц, но не стоит использовать его в этих целях.
Это очень редко-используемая функция. Обычно применяется в случае, когда нужно в тексте документа сослаться на номер страницы, отстоящей от текущей на n вперёд или назад.
Я никогда не использую эту функцию. И к тому же смещение, не сохраняется в doc-формате.
Решение проблем
Еще раз повторюсь, несмотря на все выкрутасы с нумерацией, у меня не возникало никаких проблем. Правда, я не пользуюсь форматами отличными от ODF.
Не исключаю, что криво сделанные и сохраненные в убогие форматы (docx, doc и т.д.) документы могут таить в себе сюрпризы. Но, думаю, знание основ нумерации страниц в LibreOffice поможет преодолеть все неприятности.
- Если нумерация начинается с определенного номера (который вас не устраивает), проверьте свойства первого абзаца, расположенного на первой странице.
- Нумерация внезапно началась сначала. Проверьте свойства первого абзаца на странице. Также проверьте используемый стиль страницы.
Нумерация с заголовком документа
Данная статья получилась слишком большой, поэтому пример создания красивых колонтитулов, содержащих помимо номера страницы и название текущей главы я опишу в другой статье. Тем более это касается колонтитулов, а не самой нумерации.
Заключение
МСО и LibreOffice использует один и тот же подход в работе с документами. Его же придерживается и Google Docs, AbiWord, CorelOffice, Kingsoft Office и многие другие программы, связанные с текстом.
По большому счету, интерфейс и расположение кнопок и меню не играют никакой роли. Если пользователь хорошо владеет функционалом какой-то из программ, то привыкнуть к остальным аналогам проблемы не составит.
Вместо этого, к сожалению, пользователей приучают жать на определенные кнопки в определенном месте экрана. Чуть сдвинь кнопку в сторону, и пользователь в растерянности.
Думаю, я наглядно показал никчемность и бессмысленность большинства нападок в адрес LibreOffice. Прежде чем возмущаться, и уж тем более изливать свое возмущение, попробуйте сначала разобраться в сути вопроса.
И что самое смешное, все вышеописанное можно сделать и в Word. Но мало кто из пользователей знает о таких возможностях программы. К тому же, делается это все гораздо сложнее и непонятнее, чем в LibreOffice.
Дополнительная информация
- LibreOffice: Все о нумерации страниц (Часть I)
- Изменение ориентации отдельных страниц
- Руководство по стилям LibreOffice
- Справка: Номера страниц
- Writer.Страницы, оглавление и сноски: Часто задаваемые вопросы
- Использование шаблона для создания документа
- LibreOffice: Изменение стандартного шаблона
- Поля с данными
- Связанные поля
Директивы препроцессора C#
Хотя у компилятора нет отдельного препроцессора, директивы, описанные в этом разделе, обрабатываются так, как если бы он был. Они используются в условной компиляции. В отличие от директив C и C++ вы не можете использовать их для создания макросов. Директива препроцессора должна быть единственной инструкцией в строке.
Контекст, допускающий значение NULL
Директива препроцессора #nullable устанавливает контекст с заметками о допустимости значений NULL и контекст с предупреждениями о допустимости значений NULL. Эта директива определяет, действуют ли заметки, допускающие значение NULL, и могут ли быть заданы предупреждения о допустимости значений NULL. Каждый контекст либо отключен, либо включен.
Оба контекста можно указать на уровне проекта (за пределами исходного кода C#). Директива #nullable управляет контекстами заметок и предупреждений и имеет приоритет над параметрами уровня проекта. Директива задает контексты, которыми управляет, пока другая директива не переопределит ее, или до конца исходного файла.
Ниже приведены результаты использования директив:
- #nullable disable : задает для отключенных контекстов заметки и предупреждения, допускающие значение NULL.
- #nullable enable : задает включенные контексты заметки и предупреждения, допускающие значение NULL.
- #nullable restore : восстанавливает контексты заметки и предупреждения, допускающие значение NULL, в параметры проекта.
- #nullable disable annotations : задает контекст заметки, допускающий значение NULL, отключенным .
- #nullable enable annotations : задает для включенного контекста заметки, допускающий значение NULL.
- #nullable restore annotations : восстанавливает контекст заметки, допускающий значение NULL, в параметры проекта.
- #nullable disable warnings : задает для отключенного контекста предупреждения, допускающего значение NULL.
- #nullable enable warnings : задает для включенного контекста предупреждения, допускающего значение NULL.
- #nullable restore warnings : восстанавливает контекст предупреждения, допускающего значение NULL, в параметры проекта.
Условная компиляция
Для управления условной компиляцией используются четыре директивы препроцессора.
- #if : открывает условную компиляцию, где код компилируется, только если определен указанный символ.
- #elif : закрывает предыдущую условную компиляцию и открывает новую на основе того, определен ли указанный символ.
- #else : закрывает предыдущую условную компиляцию и открывает новую, если указанный символ не определен.
- #endif : закрывает предыдущую условную компиляцию.
Компилятор C# компилирует код между #if директивой и #endif директивой, только если определен указанный символ или не определен, если ! оператор не используется. В отличие от C и C++, числовое значение символу нельзя назначить. Оператор #if в C# является логическим. Он проверяет только одно условие — определен ли указанный символ. Например, следующий код компилируется при DEBUG определении:
#if DEBUG Console.WriteLine("Debug version"); #endif
Следующий код компилируется, если MYTEST не определен:
#if !MYTEST Console.WriteLine("MYTEST is not defined"); #endif
Вы можете использовать операторы == (равенство) и != (неравенство) для проверки значений bool true или false . Значение true означает, что символ определен. Инструкция #if DEBUG имеет то же значение, что и #if (DEBUG == true) . Вы можете использовать операторы && (и), || (или) и ! (не), чтобы узнать, определено ли несколько символов. Можно также группировать символы и операторы при помощи скобок.
#if , а также #else директивы , #endif #elif #define и #undef директивы, позволяют включать или исключать код на основе существования одного или нескольких символов. Условная компиляция может быть полезной при компиляции кода для отладочной сборки или для определенной конфигурации.
Условные директивы, начинающиеся с директивы #if , должны явным образом завершаться директивой #endif . #define позволяет определить символ, чтобы выражение, в качестве которого этот символ передается в директиву #if , при вычислении давало значение true . Символ также можно определить с помощью параметра компилятора DefineConstants. Символ можно отменить с #undef помощью. Символ, создаваемый с помощью #define , будет определен в пределах того файл, в котором он определен. Символ, определенный с помощью DefineConstants или #define , не конфликтует с одноименной переменной. Соответственно, имя переменной не должно передаваться директиве препроцессора, а символ может использоваться только в директиве препроцессора.
Директива #elif позволяет создать составную условную директиву. Выражение #elif будет вычисляться в том случае, если ни одна из предшествующих директив #if или необязательных директив #elif после вычисления выражения не возвращает значение true . Если после вычисления выражения #elif возвращается значение true , компилятор вычисляет весь код между директивой #elif и следующей условной директивой. Например:
#define VC7 //. #if DEBUG Console.WriteLine("Debug build"); #elif VC7 Console.WriteLine("Visual Studio 7"); #endif
С помощью директивы #else можно создать составную условную директиву со следующим поведением: если ни одно из выражений в предшествующих директивах #if или (необязательно) #elif не принимает значение true , компилятор вычисляет код между директивой #else и последующей директивой #endif . Директива #endif обязательно указывается в качестве следующей директивы препроцессора после #else .
#endif указывает на конец условной директивы, начало которой было задано с помощью директивы #if .
Система сборки также учитывает символы препроцессора, представляющие целевые платформы в проектах в стиле SDK. Они полезны при создании приложений, предназначенных для нескольких версий .NET.
| Требуемые версии .NET Framework | Символы | Дополнительные символы (доступно в пакетах SDK для .NET 5 и более поздних версий) |
Символы платформы (доступны только при указании TFM для конкретной ОС) |
|---|---|---|---|
| .NET Framework | NETFRAMEWORK , NET48 , NET472 , NET471 , NET47 , NET462 , NET461 , NET46 , NET452 , NET451 , NET45 , NET40 , NET35 , NET20 | NET48_OR_GREATER , NET472_OR_GREATER , NET471_OR_GREATER , NET47_OR_GREATER , NET462_OR_GREATER , NET461_OR_GREATER , NET46_OR_GREATER , NET452_OR_GREATER , NET451_OR_GREATER , NET45_OR_GREATER , NET40_OR_GREATER , NET35_OR_GREATER , NET20_OR_GREATER | |
| .NET Standard | NETSTANDARD , NETSTANDARD2_1 , NETSTANDARD2_0 , NETSTANDARD1_6 , NETSTANDARD1_5 , NETSTANDARD1_4 , NETSTANDARD1_3 , NETSTANDARD1_2 , NETSTANDARD1_1 , NETSTANDARD1_0 | NETSTANDARD2_1_OR_GREATER , NETSTANDARD2_0_OR_GREATER , NETSTANDARD1_6_OR_GREATER , NETSTANDARD1_5_OR_GREATER , NETSTANDARD1_4_OR_GREATER , NETSTANDARD1_3_OR_GREATER , NETSTANDARD1_2_OR_GREATER , NETSTANDARD1_1_OR_GREATER , NETSTANDARD1_0_OR_GREATER | |
| .NET 5+ (и .NET Core) | NET , NET8_0 , NET7_0 , NET6_0 , NET5_0 , NETCOREAPP , NETCOREAPP3_1 , NETCOREAPP3_0 , NETCOREAPP2_2 , NETCOREAPP2_1 , NETCOREAPP2_0 , NETCOREAPP1_1 , NETCOREAPP1_0 | NET8_0_OR_GREATER , NET7_0_OR_GREATER , NET6_0_OR_GREATER , NET5_0_OR_GREATER , NETCOREAPP3_1_OR_GREATER , NETCOREAPP3_0_OR_GREATER , NETCOREAPP2_2_OR_GREATER , NETCOREAPP2_1_OR_GREATER , NETCOREAPP2_0_OR_GREATER , NETCOREAPP1_1_OR_GREATER , NETCOREAPP1_0_OR_GREATER | ANDROID , BROWSER , IOS , MACCATALYST , MACOS , TVOS , WINDOWS , [OS][version] (например IOS15_1 ), [OS][version]_OR_GREATER (например IOS15_1_OR_GREATER ) |
- Символы без привязки к версии определены независимо от версии, которую вы хотите использовать в качестве целевой.
- Символы для определенных версий определены только для тех версий, которые вы хотите использовать в качестве целевых.
- Символы _OR_GREATER определены для версии, которую вы хотите использовать в качестве целевой, и всех более ранних версий. Например, если вы выбрали .NET Framework 2.0, определяются следующие символы: NET20 , NET20_OR_GREATER , NET11_OR_GREATER и NET10_OR_GREATER .
- NETSTANDARD__OR_GREATER Символы определяются только для целевых объектов .NET Standard, а не для целевых объектов, реализующих .NET Standard, таких как .NET Core и платформа .NET Framework.
- Они отличаются от моникеров целевой платформы (TFM), используемых свойством MSBuild TargetFramework и NuGet.
Для традиционных проектов, в которых не используется пакет SDK, необходимо вручную настроить символы условной компиляции для различных целевых платформ в Visual Studio с помощью страниц свойств проекта.
Другие предопределенные символы включают константы DEBUG и TRACE . Вы можете переопределить значения для проектов с помощью #define . Например, символ DEBUG автоматически устанавливается в зависимости от свойств конфигурации сборки (в режиме отладки или выпуска).
В следующем примере показано, как определить символ MYTEST в файле и затем протестировать значения символов MYTEST и DEBUG . Выходные данные этого примера зависят от режима конфигурации, в котором создан проект (Отладка или Выпуск).
#define MYTEST using System; public class MyClass < static void Main() < #if (DEBUG && !MYTEST) Console.WriteLine("DEBUG is defined"); #elif (!DEBUG && MYTEST) Console.WriteLine("MYTEST is defined"); #elif (DEBUG && MYTEST) Console.WriteLine("DEBUG and MYTEST are defined"); #else Console.WriteLine("DEBUG and MYTEST are not defined"); #endif >>
В следующем примере показано, как тестировать разные целевые платформы для использования более новых интерфейсов API, когда это возможно:
public class MyClass < static void Main() < #if NET40 WebClient _client = new WebClient(); #else HttpClient _client = new HttpClient(); #endif >//. >
Определение символов
Используйте следующие две директивы препроцессора, чтобы определить или отменить определение символов для условной компиляции.
- #define : определение символа.
- #undef : подчеркивание символа.
#define позволяет определить символ. При использовании символа в качестве выражения, передаваемого #if директиве, выражение будет оцениваться true , как показано в следующем примере:
#define VERBOSE #if VERBOSE Console.WriteLine("Verbose output version"); #endif
Директиву #define нельзя использовать для объявления значений констант, как это обычно делается в C и C++. Для определения констант в C# следует использовать статические элементы класса или структуры. При наличии нескольких констант имеет смысл создать для них отдельный класс «Constants».
Символы можно использовать для указания условий компиляции. Вы можете протестировать символ с помощью одного #if или. #elif Для условной компиляции также можно использовать ConditionalAttribute. Вы можете определить символ, но не можете присвоить символу значение. Директива #define должна находиться в файле перед использованием любых инструкций, которые также не являются директивами препроцессора. Символ также можно определить с помощью параметра компилятора DefineConstants. Символ можно отменить с #undef помощью.
Определение областей
Вы можете определить области кода, которые можно свернуть в структуру, используя следующие две директивы препроцессора.
- #region : начало области.
- #endregion : конец области.
Директива #region позволяет указать блок кода, который можно разворачивать и сворачивать с помощью функции структурирования в редакторе кода. В больших файлах кода удобно сворачивать или скрывать одну область или несколько, чтобы не отвлекаться от той части файла, над которой в настоящее время идет работа. В следующем примере показано, как определить область:
#region MyClass definition public class MyClass < static void Main() < >> #endregion
В конце блока #region должна присутствовать директива #endregion . Блок #region не может накладываться на блок #if . Однако блок #region можно вложить в блок #if , а блок #if — в блок #region .
Сведения об ошибках и предупреждениях
Вы указываете компилятору создавать определенные пользователем ошибки и предупреждения компилятора, а также управлять сведениями о строках с помощью следующих директив.
- #error : создание ошибки компилятора с указанным сообщением.
- #warning : создание предупреждения компилятора с конкретным сообщением.
- #line : изменение номера строки, выводимого с сообщениями компилятора.
#error позволяет создать определяемую пользователем ошибку CS1029 из определенного места в коде. Рассмотрим пример.
#error Deprecated code in this method.
Компилятор обрабатывает #error version особым образом и сообщает об ошибке компилятора CS8304 с сообщением, содержащим используемые версии компилятора и языка.
#warning позволяет создать предупреждение компилятора CS1030 первого уровня из определенного места в коде. Например:
#warning Deprecated code in this method.
Директива #line позволяет изменять номер строки компилятора и при необходимости имя файла, в который будут выводиться ошибки и предупреждения.
В следующем примере показано, как включить в отчет два предупреждения, связанные с номерами строк. Директива #line 200 принудительно устанавливает номер следующей строки 200 (по умолчанию используется номер 6). До выполнения следующей директивы #line в отчете будет указываться имя файла Special. Директива #line default по умолчанию восстанавливает нумерацию строк в исходное состояние с учетом строк, номера которых были изменены с помощью предшествующей директивы.
class MainClass < static void Main() < #line 200 "Special" int i; int j; #line default char c; float f; #line hidden // numbering not affected string s; double d; >>
В результате компиляции формируются следующие результаты:
Special(200,13): warning CS0168: The variable 'i' is declared but never used Special(201,13): warning CS0168: The variable 'j' is declared but never used MainClass.cs(9,14): warning CS0168: The variable 'c' is declared but never used MainClass.cs(10,15): warning CS0168: The variable 'f' is declared but never used MainClass.cs(12,16): warning CS0168: The variable 's' is declared but never used MainClass.cs(13,16): warning CS0168: The variable 'd' is declared but never used
Директива #line может использоваться на автоматизированном промежуточном этапе процесса построения. Например, если строки были удалены из первоначального файла с исходным кодом, но вам по-прежнему требуется создавать выходные файлы компилятора на основе изначальной нумерации строк в файле, можно удалить строки и затем смоделировать их первичную нумерацию с помощью директивы #line .
Директива #line hidden скрывает последующие строки для отладчика. В этом случае при пошаговой проверке кода разработчиком все строки между #line hidden и следующей директивой #line (кроме случаев, когда это также директива #line hidden ) будут пропущены. Этот параметр также можно использовать для того, чтобы дать ASP.NET возможность различать определяемый пользователем и создаваемый компьютером код. В основном эта функция используется в ASP.NET, но также может быть полезна и в других генераторах исходного кода.
Директива #line hidden не влияет на имена файлов и номера строк в отчетах об ошибках. Это значит, что при обнаружении ошибки в скрытом блоке компилятор укажет в отчете текущие имя файла и номер строки, где найдена ошибка.
Директива #line filename задает имя файла, которое будет отображаться в выходных данных компилятора. По умолчанию используется фактическое имя файла с исходным кодом. Имя файла должно заключаться в двойные кавычки (» «). Перед ним должен указываться номер строки.
Начиная с C# 10 можно использовать новую форму директивы #line :
#line (1, 1) - (5, 60) 10 "partial-class.cs" /*34567*/int b = 0;
Компоненты этой формы:
- (1, 1) : начальная строка и столбец для первого символа строки, следующей за директивой. В этом примере следующая строка будет отображаться как строка 1, столбец 1.
- (5, 60) : конечная строка и столбец для помеченной области.
- 10 : смещение столбца, чтобы директива #line вступила в силу. В этом примере в качестве столбца 1 будет отображаться десятый столбец. Здесь начинается объявление int b = 0; . Это поле необязательно. Если этот параметр опущен, директива вступает в силу в первом столбце.
- «partial-class.cs» : имя выходного файла.
В предыдущем примере будет создано следующее предупреждение:
partial-class.cs(1,5,1,6): warning CS0219: The variable 'b' is assigned but its value is never used
После повторного сопоставления переменная b , находится в первой строке в символе шесть из файла partial-class.cs .
Предметно-ориентированные языки (DSL) обычно используют этот формат, чтобы обеспечить более эффективное сопоставление исходного файла с созданными выходными данными C#. Чаще всего эта расширенная #line директива используется для повторного сопоставления предупреждений или ошибок, которые отображаются в созданном файле исходному источнику. Например, рассмотрим эту страницу razor:
@page "/" Time: @DateTime.NowAndThen
Свойство DateTime.Now было введено неправильно DateTime.NowAndThen . Созданный C# для этого фрагмента razor выглядит следующим образом: page.g.cs
_builder.Add("Time: "); #line (2, 6) (2, 27) 15 "page.razor" _builder.Add(DateTime.NowAndThen);
Выходные данные компилятора для предыдущего фрагмента кода:
page.razor(2, 2, 2, 27)error CS0117: 'DateTime' does not contain a definition for 'NowAndThen'
Строка 2, столбец 6 в page.razor том, где начинается текст @DateTime.NowAndThen . Это отмечено (2, 6) в директиве. Этот диапазон заканчивается в строке @DateTime.NowAndThen 2, столбце 27. Это отмечается (2, 27) в директиве. Текст начинается DateTime.NowAndThen в столбце 15 page.g.cs . Это отмечается 15 в директиве. Объединение всех аргументов и компилятор сообщает об ошибке в его расположении page.razor . Разработчик может перейти непосредственно к ошибке в исходном коде, а не к созданному источнику.
Дополнительные примеры этого формата см. в разделе примеров в спецификации функции.
Директивы pragma
Директива #pragma предоставляет компилятору специальные инструкции для компиляции файла, в котором она появляется. Компилятор должен поддерживать эти инструкции. Другими словами, директиву #pragma невозможно использовать для создания настраиваемых инструкций предварительной обработки.
- #pragma warning : включение или отключение предупреждений.
- #pragma checksum : создание контрольной суммы.
#pragma pragma-name pragma-arguments
pragma-name — имя распознанной прагмы, а pragma-arguments — аргументы, относящиеся к прагме.
#pragma warning
#pragma warning может включать или отключать определенные предупреждения.
#pragma warning disable warning-list #pragma warning restore warning-list
warning-list — список номеров предупреждений с разделителем-запятой. Префикс CS является необязательным. Если номера предупреждений не указаны, disable отключает все предупреждения, а restore включает все предупреждения.
Чтобы найти номера предупреждений в Visual Studio, выполните сборку проекта, а затем поиск номеров предупреждений в окне Вывод.
Параметр disable вступает в силу, начиная со следующей строки исходного файла. Предупреждение восстанавливается в строке после restore . Если в файле нет restore , предупреждения восстанавливаются до их состояния по умолчанию в первой строке всех последующих файлов в той же компиляции.
// pragma_warning.cs using System; #pragma warning disable 414, CS3021 [CLSCompliant(false)] public class C < int i = 1; static void Main() < >> #pragma warning restore CS3021 [CLSCompliant(false)] // CS3021 public class D < int i = 1; public static void F() < >>
#pragma checksum
Создает контрольные суммы для исходных файлов, чтобы помочь с отладкой страниц ASP.NET.
#pragma checksum "filename" "" "checksum bytes"
«filename» — это имя файла, для которого требуется наблюдение за изменениями или обновлениями, «» — глобальный уникальный идентификатор (GUID) для хэш-алгоритма, а «checksum_bytes» — строка шестнадцатеричных цифр, представляющих байты контрольной суммы. Должно быть четным числом шестнадцатеричных цифр. Нечетное число цифр приведет к выводу предупреждения во время компиляции, и директива будет пропущена.
Отладчик Visual Studio использует контрольную сумму, чтобы подтвердить нахождение правильного источника. Компилятор вычисляет контрольную сумму для исходного файла, а затем передает результат в файл базы данных (PDB) программы. Отладчик затем использует PDB-файл для сравнения с контрольной суммой, вычисленной им для исходного файла.
Это решение не работает для проектов ASP.NET, так как рассчитанная контрольная сумма относится к созданному исходному файлу, а не файлу ASPX. Чтобы решить эту проблему, #pragma checksum предоставляет поддержку контрольных сумм для страниц ASP.NET.
При создании проекта ASP.NET в Visual C# созданный исходный файл содержит контрольную сумму для ASPX-файла, из которого создается источник. Затем компилятор записывает эти данные в PDB-файл.
Если компилятор не обнаруживает директиву #pragma checksum в файле, он вычисляет контрольную сумму и записывает значение в PDB-файл.
class TestClass < static int Main() < #pragma checksum "file.cs" "" "ab007f1d23d9" // New checksum > >
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
The .NET documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по
Как сделать нумерацию страниц в Word — 5 советов
Оформление статьи — важная часть работы после написания самого текста. В работе с документами может быть проблемным вопрос, как пронумеровать страницы в Ворде. Есть базовые лайфхаки, чтобы быстро расставить нумерацию в статье. Они будут полезны даже опытному пользователю Windows. Подборка поможет усовершенствовать свои навыки работы с текстовыми документами.
Как проставить нумерацию страниц в Ворде
В каждой сфере есть свои правила оформления документов. Пример особого форматирования — научные работы. Это диссертации, рефераты, курсовые и т.д. Здесь нумерация в MS Office выступает способом структурирования информации. Поэтому большинство людей сталкивается с вопросом, как сделать нумерацию страниц в Ворде.
Часто используют сквозную нумерацию. Это способ, где с первого листа идет последовательное нарастание единиц. Так в документе Word легко создать содержание и работать с поиском. Еще нумерация страниц защищает работы от фальсификации.

Как форматировать номера страниц: пошагово
Выполняя эти простые действия, можно легко пронумеровать документ на сотни страниц. Есть классический способ, как проставить нумерацию страниц в Ворде. Для начала нужно открыть документ Word.

Что делать дальше:
- В панели быстрого доступа перейти на вкладку с названием «Вставка».
- В правой части панели кликнуть на «Номер страницы».

3. Выбрать подходящее расположение цифры. Это могут быть варианты вверху или внизу страницы, а также слева, посередине, справа и т.д.
4. После нажатия на выбранный вариант на верхней панели появится новое окно для работы с колонтитулами.

5. Чтобы сохранить изменения, нажать «Закрыть окно колонтитулов».
Часто после понимания, как проставить нумерацию страниц в Ворде, возникает вопрос форматирования. Возможно выбирать цвета, шрифты и прочие дополнения, как и с обычным текстом.
Формат
- После шага №4 нужно продолжить работу, не закрывая окно колонтитулов.
- Вкладка с названием «Главная» откроет стандартное окно для работы с текстом.
- Двойной щелчок в области колонтитулов (сверху или снизу документа).
- Создание текста как в обычном режиме написания.
После внесения всех правок нужно вернуться на вкладку «Конструктор» и закончить работу с нумерацией. Для этого стоит выполнить шаг №5 — кликнуть «Закрыть окно колонтитулов».

Как пронумеровать страницы в Ворде без титульного листа
Эта информация поможет разобраться, как пронумеровать страницы в Ворде без титульного листа. Изменения вносят в режиме редактирования. Все происходит через меню работы с колонтитулами (повторяющимися элементами в верхней и нижней частях документа).
Выбрав «Особый колонтитул для первой странице», титульный лист останется без нумерации. Такой же параметр сработает в разных разделах статьи.
Как пронумеровать страницы в Word, начиная со второй или третьей страницы
Настройка происходит в том же окошке, где и нумерация. Нажав на вкладку «Номер страницы», нужно выбрать строку с надписью «Формат номеров страниц».
Далее можно выбрать любую страницу, с которой пойдет нумерация. Как пример, можно пронумеровать страницы в Ворде, начиная с 2. Для сохранения нужно выбрать «Начать с» и подтвердить, нажав «Ок».

Как поставить двойную нумерацию в документах Word
Хорошая возможность разделить документ и отдельные разделы — запустить двойную нумерацию. Для этого работает специальная формула.
- Создается сквозная нумерация.
- В другом колонтитуле прописывается формула. Например, выбран за основу нижний колонтитул. Далее работа идет в противоположной части (в данном примере — верхний колонтитул).
- Клик мышкой в части документа, где находится колонтитул, чтобы выделить номер. И далее комбинация клавиш Alt+F9.
- Нажатия Ctrl+F9, чтобы на экране была формула с фигурными скобками.
- К ней нужно добавить цифру – разницу страниц от сквозной нумерации (которая стоит в данном примере в нижнем колонтитуле).
- Нажатие клавиш Alt+F9 на клавиатуре, чтобы формула сработала в Ворде. Идет отдельная сквозная нумерация для раздела.
Чтобы системно пользоваться продуктами MS Office, нужно изучать дополнительные возможности. Существует много способов редактирования документов Word.
Базовые помогают со стандартным оформлением текстов. Это обычная сквозная нумерация. Дополнение к ней — возможность форматировать цифры и текст под свои запросы, меняя дизайн. Продвинутая альтернатива — выйти на новый уровень пользователя Word, используя кодирование для двойной нумерации. В любом случае, каждый из советов поможет улучшить свои навыки работы с документами.
