/// <summary>
 /// Удалить атрибут.
 /// </summary>
 /// <param name="attribute">Атрибут.</param>
 public void RemoveAttribute(ITextRenderAttribute attribute)
 {
     if (attribute == null || attribute.Id == null)
     {
         return;
     }
     ITextRenderAttribute top = null;
     if (all.ContainsKey(attribute.Id))
     {
         var stack = all[attribute.Id];
         if (stack.Count > 0)
         {
             stack.Pop();
         }
         if (stack.Count > 0)
         {
             top = stack.Peek();
         }
         else
         {
             all.Remove(attribute.Id);
         }
     }
     if (top != null)
     {
         current[attribute.Id] = top;
     }
     else
     {
         current.Remove(attribute.Id);
     }
 }
 /// <summary>
 /// Добавить атрибут.
 /// </summary>
 /// <param name="attribute">Атрибут.</param>
 public void AddAttribute(ITextRenderAttribute attribute)
 {
     if (attribute == null || attribute.Id == null)
     {
         return;
     }
     if (!all.ContainsKey(attribute.Id))
     {
         all[attribute.Id] = new Stack<ITextRenderAttribute>();
     }
     all[attribute.Id].Push(attribute);
     current[attribute.Id] = attribute;
 }
 /// <summary>
 /// Удалить атрибут.
 /// </summary>
 /// <param name="attribute">Атрибут.</param>
 public void RemoveAttribute(ITextRenderAttribute attribute)
 {
     throw new System.NotImplementedException("Нельзя изменять копию только для чтения состояния атрибутов");
 }
 /// <summary>
 /// Конструктор.
 /// </summary>
 /// <param name="attribute">Атрибут.</param>
 /// <param name="add">Добавить атрибут.</param>
 public AttributeRenderProgramElement(ITextRenderAttribute attribute, bool add)
 {
     this.add = add;
     Attribute = attribute;
 }