Numlex Документация
Справочник синтаксиса
Сообщить о проблеме

Теги, подытоги и статистика

Строки-теги, секции-разделители, подытоги, общие итоги, агрегаты по тегам, статистика, динамические случайные значения и настраиваемая статистика футера.

Теги и подытоги добавляют поверх блокнота структуру из обычного текста. Завершающий #tag помечает строку, точный разделитель --- начинает новую секцию, subtotal суммирует текущую секцию, grand total суммирует успешные подытоги, а агрегаты по тегам отвечают на total of #tag и подобные запросы. Четыре функции — count, median, stdev и rand — включены в приложение, а плавающий Total можно переключить на Sum, Average, Count или Median. Всё строго: почти-попадание остаётся обычной строкой, а агрегаты никогда не переиспользуют производные строки.

Заголовки, теги и разделители

  • Заголовок — строка, начинающаяся ровно с # (решётка и один пробел). #food — не заголовок, а строка-тег.
  • Тег — завершающий атом: # без пробела, далее идентификатор, начинающийся с буквы (буквы, цифры, _, -; до 64 графем). В конце строки может быть несколько тегов; дубликаты на одной строке схлопываются (побеждает первое написание). Регистр и NFC нормализуются для поиска, исходное написание сохраняется, поэтому декомпозированное #cafe\u0301 — валидный тег и находит тот же агрегат, что и #café. Теги никогда не меняют ответ строки и не распознаются в середине выражения (2 #food + 3 — это арифметика). Комментарии и заголовки тегов не объявляют.
  • Разделитель — строка, целиком равная --- (внешние пробелы допустимы). У него нет ответа, он никогда не входит в сумму и начинает новую секцию тегов. ---- и более длинные серии дефисов — обычные строки.
2 + 3 #math #cash     → 5, tagged math and cash
5 #a
total of #a           → 5

Секции, подытоги и общий итог

Старая команда total продолжает работать, а границей для неё теперь служат заголовок # , точный разделитель --- или ближайший total. Доступны также:

  • subtotal — суммирует eligible-строки с момента последнего подытога, заголовка или разделителя.
  • subtotal + 15% / subtotal - 15% — процент применяется к «сырому» подытогу (100 → 115).
  • <name> = subtotal[ ± 15%] — именованная форма, записывающая значение в окружение как обычный скаляр (sum = subtotal + 15% → 115).
  • grand total (и <name> = grand total) — суммирует только успешно вычисленные строки-подытоги выше; разделитель не стирает список. Провалившийся или переполнившийся подытог никогда не входит в сумму.

grand total требует минимум два успешных подытога; при меньшем числе строка становится тихой общей ошибкой Invalid expression, и ничего не угадывается.

total last N — сумма по последним строкам

total суммирует все подходящие строки своей секции. Ограниченная форма total last N суммирует только подходящие значения из N непосредственно предшествующих логических строк той же секции, после чего сбрасывает секцию ровно так же, как обычный total.

  • N — целое положительное число. После внешних пробелов или табов строка должна читаться как total last N (регистр не важен, части могут разделяться одним или несколькими пробелами либо табами). total last 0, total last -3, total last 3.5, отсутствующее число, лишние слова или слишком большое число — обычные строки, а не команды.
  • N считает логические строки, а не результаты. Пустая строка, комментарий, проза, ошибка, строки денег и единиц, одиночный токен ответа и производные строки (подытоги, общий итог, агрегаты по тегам) занимают ровно по одному слоту и ничего не добавляют. Собственная строка команды никогда не входит в свои слоты.
  • Граница секции не меняется. Окно никогда не заглядывает выше ближайшего total/total last N, заголовка # или точного разделителя ---. subtotal и grand total не являются границами старого total, но их собственные строки всё равно занимают слоты.
  • Правила отбора не меняются. Действуют те же правила, что и для обычного total: конечные безразмерные скаляры, точные целые и строки использования именованных скаляров учитываются; объявления, деньги, величины с единицами, логические значения, даты и ошибки — нет.
  • Окно больше секции суммирует то, что есть (пустая секция даёт 0), и команда сбрасывает секцию после ответа — поэтому следующий total или total last N начинается с пустой секции.
  • Переполнение и динамические значения оцениваются по окну. Тихая ошибка Invalid expression появляется, только если переполнилась сумма выбранных строк; переполнение выше окна на неё не влияет. Строка динамическая (зависит от rand) только тогда, когда динамическим оказался выбранный подходящий вклад.
  • Затенение общее: активная переменная или константа с именем total отключает обе формы, как и раньше.
10
20

30
total last 2        → 30    (the blank line took a slot and added nothing)
40
50
total last 3        → 90    (only 40 and 50 were in the window)
total               → 0     (the section was already reset)
10
20
subtotal              → 30

10
subtotal
20
subtotal
grand total           → 30

Заголовок или разделитель сбрасывает аккумулятор подытога:

10
# Section
20
subtotal              → 20

Строка старого total не является границей для подытога; она исключается из подытога как производная строка, но собственная секция старого total по-прежнему охватывает строку подытога.

Какие строки подходят

Подходят конечные безразмерные скаляры (обычные числа, дроби, проценты, множители), точные целые и строки, использующие именованные скаляры. Не подходят: объявления (x = …), строки из одного токена, деньги, величины с единицами, логические/датовые/ временные/гео-значения, ошибки, разделители и все производные строки. Токен внутри настоящего выражения считается; строка только из токена — нет.

x = 5
x + 5
$7
3 kg
true
50%
1/4
0xFF
2 + 3
subtotal              → 270.75

Добавление структурных строк

  • File → Add Subtotal (⌘T) и File → Add Grand Total (⌘⇧T) вставляют команду в строку каретки. Они срабатывают только когда целевая строка пуста (пробельная) или является строгим пустым <name> = (пробелы в конце допустимы); на любом другом содержимом — сигнал и никаких изменений. ⌘⇧T дополнительно требует как минимум два успешных подытога выше.
  • Двойной клик по пустой строке ответа (пробельной или строгому <name> =) вставляет subtotal через тот же планировщик. Заголовки, комментарии, разделители, строки-теги, проза и ошибки остаются инертными.
  • Convert to Normal Line в контекстном меню строки подытога/общего итога заменяет команду на локально перенабираемый числовой литерал полной точности отображённого значения; именованная форма сохраняет префикс <name> =, а число строк и стабильные идентификаторы не меняются.

Агрегаты по тегам

total of #tag, average of #tag, count of #tag и median of #tag (регистр не важен; ровно один тег в запросе) видят только подходящие строки с этим тегом строго выше себя в текущей секции — разделитель закрывает секцию. Строка с несколькими тегами входит в каждый тег по разу. Пустое множество даёт 0 для total/count и тихую ошибку для average/median. Производные агрегатные строки никогда не питают последующие агрегаты, подытог или футер.

Статистические функции и естественные фразы

count, median и выборочный stdev (n−1) входят в 27 встроенных функций, а rand даёт включительные случайные целые. Каждая функция следует общим правилам вызова: имена без учёта регистра, аргументы — полные выражения, строгие ошибки арности и области.

  • count(1, 2, 3) → 3
  • median(1, 2, 3) → 2
  • median(1, 2, 3, 4) → 2.5
  • stdev(2, 4, 4, 4, 5, 5, 7, 9) → ≈ 2.13809 (выборочное, n−1)
  • rand(1, 6) → равномерное целое в 1…6

Естественные фразы покрывают то же: median of 1, 2, 3 → 2, count of 1, 2, 3, 4 → 4, standard deviation of 2, 4, 4, 4, 5, 5, 7, 9 и random number between X and Y. Список использует активный разделитель аргументов (, в точечных форматах, ; в запятых), поэтому median of 1,5; 2,5; 3,5 → 2.5 в запятом формате. Результаты следуют десятичным знакам листа. Медиана и среднее устойчивы к переполнению, поэтому конечные экстремальные значения не дают бесконечность.

Динамические случайные значения

Строка становится динамической, когда rand реально выполнился (пробел и регистр перед ( не важны) или когда она читает динамическое имя. Незапущенная ветка if, комментарии и невалидный текст динамическими не становятся. Зависимость распространяется через именованные значения, subtotal, grand total и агрегаты по тегам; вид строки сохраняется (подытог остаётся подытогом).

Динамическое значение остаётся стабильным, пока вы не измените лист или не нажмёте ⌘R (Recalculate Dynamic Values); прокрутка, наведение, смена формата и меню футера не перерисовывают его. Оно никогда не токенизируется и не входит в цепочку Previous Answer. Экспорт PDF фиксирует текущее значение.

Статистика футера

Правый клик по плавающему Total открывает выбор Sum, Average, Count или Median в одном нативном меню с отметкой. Выбор — глобальная для приложения сохраняемая настройка (никогда не часть .nlx), и он меняет только футер — никогда содержимое листа, каретку, выделение, IME, прокрутку или редактор. Count показывает точное целое; остальные статистики используют глобальное представление чисел. Панель использует те же канонические подходящие строки, что и итоги выше: производные агрегатные строки (inline-итоги, подытоги, общие итоги, агрегаты по тегам, разделители) никогда не входят, а значение по умолчанию Sum совпадает с прежним Total. Неизвестное значение падает обратно в Sum.

Токены, экспорт и взаимодействие с итогами

  • Конечная строка агрегата по тегу или подытога — обычное число для Answer Tokens; тот же результат никогда не переиспользуется последующим агрегатом, подытогом или футером.
  • Округление и переопределения формата отдельных ответов никогда не меняют статистику футера; она следует глобальной нотации и региональным настройкам.
  • Экспорт PDF и печать сохраняют производные строки помеченными как производные, поэтому экспортированная страница никогда не считает их дважды, а экспорт фиксирует текущее случайное значение.

Связанные разделы

Нашли ошибку в документации? Сообщите о ней на GitHub