все вопросы по Anki задавайте на форуме  reddit.com/r/AnkiRu/ 

• Пропуски

В Anki есть ещё один тип записей, помимо трёх рассмотренных.
Называется он Пропуски (англ. Cloze).

Любой из трёх основных типов легко можно превратить в другой основной
простым редактированием списка полей и шаблонов карточек.

  1. Пропуски нельзя превратить в Основные (и их клоны) ни при каких условиях!

    И наоборот, из Основных никакими усилиями нельзя получить Пропуски.

  2. Но в Основных пропуски можно имитировать.

    Пропуски же а’ля Основные (без пропущенных слов) работать просто не будут.

Cloze

Пропуски придуманы для того, чтобы облегчить решение следующей задачи.

Вот есть для разучивания основная карточка:

3 • 4 = ?


3 × 4 = 12

Первое, что бросается в глаза — это повторение большей части вопроса в ответе.
И, как следствие, возможность возникновения расхождений между ними
в процессе создания записи или при последующих корректировках.

Дальше решено учить также такие варианты:

3 * ? = 12


3 × 4 = 12

? • 4 = 12


3 + 4 = 12

Для её решения в тип записей придётся добавить ещё два поля и ещё пару шаблонов карточек.
Возрос объём работы по заполнению карточек, возросла вероятность внесения ошибок.

Вместо всего этого добавляем новую запись Пропуски:

и для поля Текст в окне редактирования HTML добавляем смысл
подобно содержимому поля Ответ на Основных карточках:

Дальше выделяем фрагмент, который в вопросе должен быть скрыт,
и клик по кнопке с многоточием или Ctrl+Shift+C на клавиатуре:

Получается поле со следующим текстом:

Читается так: в первую очередь скрыть текст 12

Ну а дальше точно таким же выделением и кликом по кнопочке скрываем первый множитель.

Второй множительно можно просто с клавиатуры указать как {{c3::4}},
то есть вызывать всякий раз мастера пропусков не требуется.

Более того, если выделить ещё какой-нибудь фрагмент, (скажем, знак равенства)
и вызвать для него мастер пропусков, то он совершенно корректно проставит следующий номер: {{c4::=}}

Из единственного такого шаблона необходимое количество карточек
(по количеству скрытых полей) будет создано автоматически.

{ 3 x 4 = ... }
так выглядит вопрос с пропуском
 { 3 x 4 = 12 }
а так выглядит ответ на этот вопрос

Цвет, шрифт (начертание), размер букв и другие элементы
стиля оформления пропуска — настраиваются автором колоды.

Итак,
  1. в первый день спрашивается произведение,

  2. во второй — первый множитель,

  3. в третий день — второй множитель.

Разумеется, если в настройках колоды сняты ограничения
на показ связанных карточек в один день,
то все три карточки могут быть показаны буквально друг за другом.

Если при создании (или редактировании) записи в поле Текст
не указать ни одного пропуска, то будет задан вопрос: Вы уверены?

Надо вернуться и добавить хотя бы один пропуск.

Если ответить да, то при попытке учить эту карточку будет выдано сообщение:

 { Пожалуйста, отредактируйте эту запись, добавив несколько пропусков для заполнения. }

Что за странное окно? В Обозревателе Anki есть возможность
предпросмотра карточек текущей записи:

Можно скрыть два (и более) поля под одним номером,
тогда они окажутся на одной карточке:

 { {{c1:6}} * {{c1:8}} = 48 }
Подсказка Чтобы номер не увеличивался, надо держать на клавиатуре Alt
при клике мышкой по кнопке с многоточием.
 { ... * ... = 48 }
 { 6 * 8 = 48 }

Конечно, пример несколько надуманный.
Вряд ли кто-то станет так учить таблицу умножения.

Хорошо, вот пример получше:

Примечание
Кстати говоря,
при попытке использовать пропуски в полях основных типов карточек
выскакивает предупреждение о том, что работать как задумано
они всё равно не будут, если не изменить тип записи на Пропуски

Ну а карточку 6-на-8 надо удалить.

Пропуск с подсказкой

Да, надо упомянуть ещё такую возможность:

Вместо многоточия на месте пропуска можно указать текст,
который послужит подсказкой, например.

{{c1::Надеждинск::Кабаковск}}

Удаление записи (не карточки!)

Важно! Карточку в Anki удалить нельзя, только запись целиком!
Запись можно удалить двумя путями:
  1. когда показывается карточка (как лицевой сторой, так и оборотной), достаточно просто нажать на клавиатуре клавишу Del
    или выбрать строку Удалить запись из выпадающего списка Ещё
    в правом нижнем углу окна карточки

Предупреждение
Да-да, именно так.
Даже если ты находишься в окне карточки, удаляться именно запись,
то есть все остальные связанные карточки тоже будут удалены!
  1. в Обозревателе Anki — выделив нужные записи и кликнув Удалить на тулбаре (панели инструментов)
    в правом верхнем углу окна

Осторожно!
Да-да, именно так.
В Обозревателе Anki, даже если выделена одна карточка (из нескольких, принадлежащих этой же записи) — удаляется запись целиком, со всеми остальными её карточками!

Набор на клавиатуре

{{type:cloze:…​}}

Собственно, для того, чтобы набрать на клавиатуре
скрытый фрагмент — всё просто, двойной префикс:

Значения двух и более одновременно скрытых фрагментов
должны быть введены через запятую и пробел:

hint на cloze

не работает. Такого даже не придумали.

<div class=hint>{{hint:cloze:Текст}}</div>

Просто закроет и откроет текст с пропусками,
на сами пропуски никак не повлияет.

<div class=hint>{{hint:Текст}}</div>

Просто закроет и откроет те ошмётки, что остаются от поля,
если из него удалить все закрытые фрагменты.

Например, для поля останется лишь и основали в году.

{{c3::Татищев}} и {{c3::де Геннин}} основали {{c2::Екатеринбург}} в {{c1::1723}} году.

Несколько полей ввода

Иногда людям хочется странного
да совершенно естественное желание, чего уж там стесняться!

Например, на карточке записи типа Пропуски хочется набирать ответ
точно в месте пропущенного слова/фразы, а не где-то там в стороне
(а в случае, если одновременно пропущены несколько фрагментов,
то их придётся набирать через запятую и пробел к тому же).

Сделайте мне краси́во
Лицевая сторона карточки
Оборотная сторона карточки

Для решения этой проблемы с реддита взят за основу и допилен
JavaScript на лицевую сторону карточки:

Учёл и вариант с подсказкой {{c1::Скрытое::Подсказка}}
  через title= и placeholder=

Примечание Если на лицевой стороне карточки с пропусками нет поля для ввода ответа,
то скрипт просто убирает квадратные скобки с пропусков.

Пропуски на JavaScript

{{type:cloze:Текст}}{{cloze:Текст}}
<script type="text/javascript">
var fields = [];

function updateMain() {
  var textbox = document.getElementById("typeans");
  var str = "";
  var previous = "";
  var maxLength = fields.length;
  for (var i = 0; i < maxLength; i++) {
    //add the comma beforehand instead of afterwards,
    //this avoids the need to explicitly handle consolidating
    //two consecutive fields with the same value.
    var toAdd = fields[i].value;
    var addComma = (i != 0 && toAdd != previous);
    if (addComma) {
      str += ", ";
    }
    if (toAdd == previous)
      continue; //do nothing if the same data is consecutive.
    str += toAdd;
    previous = toAdd;
  }
  textbox.value = str;
  return true;
}
mungeCloze = function() {
  var textbox = document.getElementById("typeans")
  var clozes = document.getElementsByClassName("cloze");
  if (clozes.length == 0)
    return;
  if (textbox == null) { // remove square brackets, if there is no type: on this side of the card
    var i, skips = document.getElementsByClassName('cloze');
    for (i = 0; i < skips.length; i++) {
      skips[i].innerHTML = skips[i].innerHTML.slice(1, -1);
    }
    return;
  }
  var needsWork = (clozes.length > 1);
  fields = [];
  if (!needsWork) {
    var cloze = clozes[0];
    if (cloze != null) {
      textbox.removeAttribute("class")
      var container = cloze.parentNode;
      container.insertBefore(textbox, cloze);
      container.removeChild(cloze);
      textbox.style.display = ""; //make visible.
      textbox.setAttribute("class", "typeans");
      //textbox.setAttribute("placeholder", cloze.innerHTML.slice(1,-1));
      textbox.setAttribute("title", " " + cloze.innerHTML.slice(1, -1) + " ");

      function span12(textbox) {
        var span1 = document.createElement('span');
        span1.style.position = 'relative';
        span1.style.display = 'inline';
        span1.style.whiteSpace = 'nowrap';
        var span2 = document.createElement('span');
        span2.style.position = 'absolute';
        span2.style.top = '0px';
        span2.style.left = '1px';
        span2.style.color = 'silver';
        textbox.parentNode.insertBefore(span1, textbox);
        span1.appendChild(textbox);
        span1.appendChild(span2);
        textbox.setAttribute("onkeydown",
          "this.nextSibling.style.visibility='hidden';" +
          "this.style.backgroundColor='default';");
        span2.style.width = textbox.clientWidth + 'px';
        span2.style.height = textbox.clientHeight + 'px';
        textbox.style.backgroundColor = 'transparent !important';
        textbox.style.border = 'solid 1px gray';
        textbox.style.borderRadius = '3px';
        span2.style.overflow = 'hidden';
        span2.style.textOverflow = 'ellipsis';
        textbox.style.textAlign = 'center';
        span2.style.textAlign = 'center'; // 'left';
        span2.innerHTML = cloze.innerHTML.slice(1, -1);
        span2.style.zIndex = "-1";
        span2.setAttribute("title", " " + cloze.innerHTML.slice(1, -1) + " ");
      }
      span12(textbox);
    }
  } else {
    //instead of inserting, we should clone the textbox and insert that into the deletions.
    var length = clozes.length;
    var originalTextbox = textbox;
    for (var i = 0; i < length; i++) {
      var cloze = clozes[i];
      if (cloze == null)
        continue;
      var textboxToReplace = originalTextbox.cloneNode(true);
      textboxToReplace.id = "typeans" + (i + 1);
      textboxToReplace.setAttribute("class", "typeans");
      textboxToReplace.onkeyup = updateMain;
      //textboxToReplace.setAttribute("placeholder", cloze.innerHTML.slice(1,-1));
      textboxToReplace.setAttribute("title", " " + cloze.innerHTML.slice(1, -1) + " ");
      var container = cloze.parentNode;
      container.insertBefore(textboxToReplace, cloze);
      span12(textboxToReplace);
      fields.push(textboxToReplace);
    }
    while (clozes.length > 0) {
      cloze = clozes[0];
      container = cloze.parentNode;
      container.removeChild(cloze);
    }
    originalTextbox.style.display = "none";
    // -- фокус после всех этих хитростей оказывается на скрытом поле
    // -- войти в первое поле с клавиатуры - нажатием Tab
    document.getElementById('typeans1').focus();
    // -- или пусть курсор сразу будет в этом поле, но тогда в нём не виден placeholder=
  }
}
mungeCloze();
</script>

Если за один показ скрывается только один фрагмент (а это наиболее частый случай использования пропусков), то в стилях можно указать ширину такого поля ввода, например:

#typeans { width: 50px !important; }
Важно!

При указании ширины надо использовать ключевое слово !important,
иначе Anki принудительно назначит ширину 100%.

Равно как и для начертания (названия) и размера шрифта поля ввода
#typeans { font-family: …​ !important; font-size: …​ !important; }
иначе Anki использует те, которые указаны   в  списке полей типа записи.

Для нескольких полей, скрываемых одновременно, такой фокус не сработает. В этом случае следует действовать через класс, например:

.typeans:first-of-type {
    width: 444px !important;
}
.typeans:last-of-type {
    color: red;
}

Или через номерные идентификаторы:

#typeans1 {
    letter-spacing: .1em;
}
#typeans2 {
    font-style: italic;
}
#typeans3 {
    color: green;
}

И оборотная сторона карточки:

{{type:cloze:Текст}}<br>{{cloze:Текст}}<br><br>{{Дополнительно}}
Примечание

C подсказкой {{c1::Скрытое::Подсказка}} через placeholder есть одна проблема — подсказка исчезает при получении фокуса, а не при нажатии первой клавиши. По факту это приводит к тому, что у первого поля (а зачастую и единственного) подсказка изначально не видна, ведь курсор в нём сразу после открытия стороны карточки. Поэтому сделал, что подсказку видно и во всплывающей подсказке при наведении указателя мыши, но это паллиатив.

Дальнейшим решением стал код функции span12,
который скрывает имитацию placeholder
только при первом нажатии клавиши.

Основная идея там такая:
<span style="position:relative;">
<input type="text" _placeholder="калина-малина" _style="width:12em;"
 onkeydown="this.nextSibling.style.display='none';">
<span style="position:absolute;top:0px;left:0px;color:#abc;">малина-калина</span>
</span>
Осторожно!
К сожалению, код не получился универсальным,
он требует согласования между собой стилей поля ввода и окружающего текста, в частности, используемого шрифта, его размера и цвета, а также цвета фона.

 

Derek Sivers

У Дерека Сиверса (есть и перевод на хабре)
в колоде JavaScript встретилась такая карточка, например:

Reference types are sometimes called object definitions,
because they describe the properties and methods that objects should have.

Карточка изначальная

Так выглядит вопрос
А так выглядит ответ
И так это выглядит изнутри

По-русски это называется…​ нет, не матерным словом.
Масло масляное это называется по-русски.

Для европейцев пусть будет Баден-Баден.
Точнее, epic fail.

Это путь в никуда.

Даже если вы умудритесь запомнить эту карточку,
вы в жизни никогда не сможете опознать ту ситуацию,
где это знание следует применить.

Подсказка Тут надо использовать специальный тип записей, Пропуски

Делай Раз

Так выглядит простая копипаста в начале создания записи для карточек с пропусками:

Далее надо указать слова, которые следует пропустить.

Пропускаемое слово

Выделяем первое слово и клик по кнопочке с многоточием
ну или конфигурация из трёх пальцев клавиш Ctrl+Shift+C

c1 в данном шаблоне означает cloze—слово, которое будет скрыто первым.

Работает это так:

На стороне вопроса показывается фраза без закрытого слова.
На стороне ответа фраза показывается целиком, но…​
Подсказка

Закрытое слово и на стороне вопроса, и на стороне ответа
выделено цветом и полужирным шрифтом.

Уже хорошо (по сравнению с исходником),

Но в оригинале пропущено два слова.

Пропускаемые слова

Можно выделить оба слова:

Но это работает несколько иначе, нежели задумывалось автором карточки.

В сокрытии нет подсказки, что это два слова,
и оно никак не намекает на длину этих слов.

Вообще говоря, может быть, это и хорошо, и правильно. Но
у автора карточки задумка была несколько иная.

Пропускаемые по очереди

Если вместо объединения двух слов в одно закрытие
выделить просто второе слово и снова кликнуть по кнопочке,
то префикс у закрытия будет назначен c2

И это означает, что каждое слово будет закрываться отдельно,
то есть будут показаны две карточки,

на первой не будет первого слова, на второй — второго.

Примечание Причём карточки считаются связанными,
и если в группе настроек, назначенной колоде,
в которой находятся карточки с пропусками,
выставлены галочки Откладывать связанные до следующего дня
(а по умолчанию это именно так), то
вторая карточка будет показана только на следующий день после первой
(то есть в один день рядом друг с другом вы их никак не увидите).

Вообще говоря, может быть, это и хорошо, и правильно. Но
у автора карточки задумка была несколько иная.

Пропускаемые вместе

Подсказка Чтобы счётчик не увеличивался, надо
при клике мышкой держать нажатой клавишу Alt

Ну или на клавиатуре комбинация из 4етырёх(, Карл!) клавиш:
Ctrl+Shift+Alt+C

Лицевая сторона уже лучше,

Оборотная сторона так вообще just the same.

Подчёркивания вместо многоточия

Но нужны подчёркивания длиною в жизнь слов.

 { через второе двойное двоеточие можно указать заполнитель вместо многоточия }

Да, именно так, через ещё одно двойное двоеточие
можно указать, что хотим видеть вместо точек:

Вынести за скобки

Теперь дело за малым: надо убрать квадратные скобки.

Через JavaScript, конечно же, это легко реализуемо.

{{cloze:Текст}}
<script>
  var i, skips = document.getElementsByClassName('cloze');
  for (i = 0; i < skips.length; i++) {
    skips[i].innerHTML = skips[i].innerHTML.slice(1, -1);
  }
</script>
.card {
    font-family: monospace;
    font-size: 20px;
    text-align: center;
    color: black;
    background-color: white;
}
.cloze {
    font-weight: bold;
    color: blue;
}
.G {
    color: gray;
}
#rem {
    padding-top: 1em;
}
<div class=G>{{cloze:Текст}}</div>
<div style="color:#333;" id=rem>{{Дополнительно}}</div>
<style>
    .cloze {
        font-weight: 400;
        border-bottom: solid 1px blue;
    }
</style>

По-русски

Подсказка Ну а в Дополнительно я бы поставил русский перевод,
всё же мы русские люди и так запомнить будет гораздо легче.
Reference types are sometimes called object definitions,
because they describe the properties and methods that objects should have.
Доверяй, но проверяй!

Спасибо Яндекс .Переводчику
(в принципе понимал, о чём речь, но зачем-то попросил перевести),
без него ещё долго бы не замечал, что в исходной фразе пропущена буковка t

Ссылочные типы иногда называют определениями объектов,
потому что они описывают свойства и методы, которые объекты должны иметь.

 

Дерек Сиверс

У Дерека Сиверса в колоде JavaScript есть и такая карточка:

Q: "typeof" operator will return one of six strings:
A: "undefined"
"boolean"
"number"
"string"
"function"
"object" if object (other than function) or null

По названию встроенной функции предлагается вспоминать
список возвращаемых значений, да ещё и с комментариями.

Запомнить практически невозможно. Да и не нужно.

Вам никогда и нигде в жизни не придётся перечислять на память всё списком.
Ну разве что на зачёте по какому-нибудь дурацкому курсу информатики в школе.

Нарушено 9 правило Петра Возняка: избегайте наборов

Пропуски вместо наборов

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

Забираем Вопрос и Ответ на лицевую сторону:

Сразу же добавляем JavaScript на удаление квадратных скобок,
ясно, что они здесь будут явно лишними.

Вместо перечисления подряд создаём список:

контекстной заменой в любом текстовом редакторе
<div> на <li> и </div> на </li>

Удаляем получившуюся пустую строку.
Расставляем пропуски:
Но на карточке это не выглядит так красиво, как в поле:
Выравниваем строки по левому краю:
li { text-align: left; }
Однако стоит сделать окно пошире…​
Ограничиваем ширину блока его содержимым и загоняем в центр
ul { display: inline-block; }
Теперь появляется подозрение, что точки всё-таки лишние
ul { list-style-type: none; }

Лучше не стало. Теперь кажется, что

Мешает комментарий, цветом не отличающийся от основного текста
i { color: gray; }

Становится ясно, что мешают кавычки

К тому же, в коде JavaScript — typeof не заключается в кавычки вовсе
А вместо кавычек в JavaScript строки можно заключать и в апострофы
Без мешающих символов